【发布时间】:2017-11-08 03:05:52
【问题描述】:
如何按SQLite中的相邻记录对列进行分组?
情况
MCVE 用于 12 表 JOIN-ed SELECT 查询(按多列分组)。
表格
表 entity_log 存储 value(随着时间的推移;timest 作为 Unix 时间时间戳):
CREATE TABLE entity_log (
id INTEGER PRIMARY KEY,
timest INTEGER,
entity INTEGER /*REFERENCES entity_table(id)*/,
value INTEGER
);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160703, 0, 0);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160704, 0, 0);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160705, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160706, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160707, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160708, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160709, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160710, 0, 1);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160711, 0, 0);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160712, 0, 0);
INSERT INTO entity_log (timest, entity, value) VALUES (1510160713, 0, 0);
查询
按时间顺序排列的value - 出现次数,聚合到min(timest) 和max(timest):
SELECT
min(timest) AS timest_first,
max(timest) AS timest_last,
value
FROM
entity_log
WHERE
entity = 0
GROUP BY
value
ORDER BY
timest_last DESC
;
结果
如果某个value重复出现(但不相邻;0,1,0而不是0,0,1),则聚合timest-范围重叠:
timest_first timest_last value
........03 ........13 0
........05 ........10 1
目标
通过按时间顺序相邻的记录进一步分组value:
timest_first timest_last value
........11 ........13 0
........05 ........10 1
........03 ........04 0
【问题讨论】:
标签: sql sqlite group-by gaps-and-islands