SQL 中的序列计数

问题描述 投票:0回答:1

输入表示例:

id 日期 旗帜
1 2020-1-1 1
2 2020-1-2 1
3 2020-1-3 1
4 2020-1-4 0
5 2020-1-5 0
6 2020-1-6 1
7 2020-1-7 0
8 2020-1-8 1
9 2020-1-9 1

输出表:

开始日期 结束日期 状态 长度
2020-1-1 2020-1-3 1 3
2020-1-4 2020-1-5 0 2
2020-1-6 2020-1-6 1 1
2020-1-7 2020-1-7 0 1
2020-1-8 2020-1-9 1 2

我的数据库:sqlite3

非常感谢您的帮助

我尝试了很多使用聊天机器人来解决这个问题,但他们给出的查询无法正常工作!

sql sqlite
1个回答
0
投票

这就是所谓的间隙和岛屿问题。受 SQL 计数结果分组、重复组的启发,您可以执行以下操作:

SELECT MIN(date) AS start_date, MAX(date) AS end_date, flag AS status, COUNT(*) AS length
FROM (
    SELECT *,
        ROW_NUMBER() OVER (ORDER BY id)
        - ROW_NUMBER() OVER (PARTITION BY flag ORDER BY id) AS grp
    FROM t
)
GROUP BY grp, flag
ORDER BY 1;
© www.soinside.com 2019 - 2024. All rights reserved.