输入表示例:
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 计数结果分组、重复组的启发,您可以执行以下操作:
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;