我有一个SQLite数据库,其中包含一段时间内在癌症有机体中发现的死亡细胞的百分比(注意:为了可读性,时间列值被更改为简单的数字)。
id time deadcellspercent
1 000000001000000000 35
2 000000002000000000 54
3 000000003000000000 31
4 000000004000000000 15
5 000000005000000000 38
6 000000006000000000 70
7 000000007000000000 28
8 000000008000000000 13
9 000000009000000000 99
10 000000010000000000 51我想创建一个SQLite查询,它将返回百分比低于某个阈值数字的时间范围。例如,如果我说我希望阈值是>= 20,那么查询结果应该返回:
ts_start ts_end
000000001000000000 000000003000000000
000000005000000000 000000007000000000
000000009000000000 000000010000000000我如何构造查询来实现这一点呢?我读过诸如"SQLite“、"gaps and islands”和"analytic functions“之类的主题,但我是SQLite新手,无法理解它们以获得所需的结果。
任何帮助都将不胜感激。
发布于 2019-01-04 21:11:53
有了窗口函数、空隙和孤岛,您就走上了正确的道路。
首先,让我们使用您的示例数据并用它填充一个表:
CREATE TABLE cells(id INTEGER PRIMARY KEY, time TEXT, deadcellspercent INTEGER);
INSERT INTO cells VALUES(1,'000000001000000000',35);
INSERT INTO cells VALUES(2,'000000002000000000',54);
INSERT INTO cells VALUES(3,'000000003000000000',31);
INSERT INTO cells VALUES(4,'000000004000000000',15);
INSERT INTO cells VALUES(5,'000000005000000000',38);
INSERT INTO cells VALUES(6,'000000006000000000',70);
INSERT INTO cells VALUES(7,'000000007000000000',28);
INSERT INTO cells VALUES(8,'000000008000000000',13);
INSERT INTO cells VALUES(9,'000000009000000000',99);
INSERT INTO cells VALUES(10,'000000010000000000',51);一种可能的查询(它使用窗口函数,因此需要sqlite - 3.25或更高版本的最新版本):
WITH islands AS (SELECT id, time
, row_number() OVER w1 - row_number() OVER w2 AS diff
, deadcellspercent >= 20 AS wanted
FROM cells
WINDOW w1 AS (ORDER BY time)
, w2 AS (PARTITION BY deadcellspercent >= 20 ORDER BY time))
SELECT min(time) AS ts_start, max(time) AS ts_end
FROM islands
WHERE wanted = 1
GROUP BY diff
ORDER BY diff;产生:
ts_start ts_end
------------------ ------------------
000000001000000000 000000003000000000
000000005000000000 000000007000000000
000000009000000000 000000010000000000(在DBA stackexchange上受到this post的严重影响;请参考它以获得解释)。
https://stackoverflow.com/questions/54031508
复制相似问题