首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q:用于在数据中查找孤岛的SQLite查询(即,值满足特定阈值的连续行)

Q:用于在数据中查找孤岛的SQLite查询(即,值满足特定阈值的连续行)
EN

Stack Overflow用户
提问于 2019-01-04 08:06:04
回答 1查看 266关注 0票数 0

我有一个SQLite数据库,其中包含一段时间内在癌症有机体中发现的死亡细胞的百分比(注意:为了可读性,时间列值被更改为简单的数字)。

代码语言:javascript
复制
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,那么查询结果应该返回:

代码语言:javascript
复制
ts_start            ts_end
000000001000000000  000000003000000000
000000005000000000  000000007000000000
000000009000000000  000000010000000000

我如何构造查询来实现这一点呢?我读过诸如"SQLite“、"gaps and islands”和"analytic functions“之类的主题,但我是SQLite新手,无法理解它们以获得所需的结果。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-04 21:11:53

有了窗口函数、空隙和孤岛,您就走上了正确的道路。

首先,让我们使用您的示例数据并用它填充一个表:

代码语言:javascript
复制
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或更高版本的最新版本):

代码语言:javascript
复制
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;

产生:

代码语言:javascript
复制
ts_start            ts_end            
------------------  ------------------
000000001000000000  000000003000000000
000000005000000000  000000007000000000
000000009000000000  000000010000000000

(在DBA stackexchange上受到this post的严重影响;请参考它以获得解释)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54031508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档