提问人:OldFred 提问时间:9/24/2023 最后编辑:BergiOldFred 更新时间:9/24/2023 访问量:26
尝试在文本上下文中列出 Postgres DB 中的日期条纹
Trying to list streaks of dates in Postgres DB in a textual context
问:
我有一个带有“日期”列的表,用于在用户完成当天的事件时存储数据:
completed_date |
---|
2023-09-23 |
2023-09-21 |
2023-09-20 |
2023-09-03 |
2023-09-04 |
2023-09-05 |
2023-09-06 |
2023-09-10 |
2023-09-11 |
我需要能够以下列形式检索日期条纹(仅包括一天条纹):
1 天 ....23/九月
2 天 ....9月20日至9月21日
2 天 ....10/九月 - 11/九月
4 天 ....9 月 3 日至 9 月 6 日
我尝试了各种嵌套 CTE 的组合,并且已经敲打了一个多星期没有接近成功,尽管我知道岛屿和海洋的概念,并且在这里经历了很多关于连续日期范围的例子,但它们似乎都涵盖了识别条纹,但无法准确列出它们。
我正在使用 Postgres 版本 15.1
到目前为止,我想出的最好的是:
WITH RECURSIVE cte
AS
(
select completed_date, 1 as cnt, array [completed_date::date] as dates
FROM schedule_completed
UNION ALL
select a.completed_date, c.cnt + 1, array_append(dates, a.completed_date )
FROM schedule_completed a inner JOIN cte c
ON a.completed_date = c.completed_date - interval '1' day
),
cte2 AS
(select distinct cnt, completed_date as start_date, completed_date + interval '1' day * (cnt - 1) as end_date, dates from cte order by cnt desc)
select * from cte2
返回:
碳纳米管 | start_date | end_date | 日期 |
---|---|---|---|
4 | 2023-09-03 | 2023-09-06 00:00:00 | 2023-09-06,2023-09-05,2023-09-04,2023-09-03 |
3 | 2023-09-04 | 2023-09-06 00:00:00 | 2023-09-06,2023-09-05,2023-09-04 |
3 | 2023-09-03 | 2023-09-05 00:00:00 | 2023-09-05,2023-09-04,2023-09-03 |
2 | 2023-09-20 | 2023-09-21 00:00:00 | 2023-09-21,2023-09-20 |
2 | 2023-09-03 | 2023-09-04 00:00:00 | 2023-09-04,2023-09-03 |
2 | 2023-09-04 | 2023-09-05 00:00:00 | 2023-09-05,2023-09-04 |
2 | 2023-09-10 | 2023-09-11 00:00:00 | 2023-09-11,2023-09-10 |
2 | 2023-09-05 | 2023-09-06 00:00:00 | 2023-09-06,2023-09-05 |
1 | 2023-09-23 | 2023-09-23 00:00:00 | 2023-09-23 |
1 | 2023-09-03 | 2023-09-03 00:00:00 | 2023-09-03 |
1 | 2023-09-05 | 2023-09-05 00:00:00 | 2023-09-05 |
1 | 2023-09-10 | 2023-09-10 00:00:00 | 2023-09-10 |
1 | 2023-09-21 | 2023-09-21 00:00:00 | 2023-09-21 |
1 | 2023-09-06 | 2023-09-06 00:00:00 | 2023-09-06 |
1 | 2023-09-04 | 2023-09-04 00:00:00 | 2023-09-04 |
1 | 2023-09-11 | 2023-09-11 00:00:00 | 2023-09-11 |
1 | 2023-09-20 | 2023-09-20 00:00:00 | 2023-09-20 |
正如你所看到的,它并不漂亮!第 2 行(3 个日期)不应该在那里,因为它是第 1 行(4 个日期)的数据子集,与第 5 行(2 个日期)相同,它是第 1 行和第 2 行的子集。
我完全被困住了!
答: 暂无答案
评论