尝试在文本上下文中列出 Postgres DB 中的日期条纹

Trying to list streaks of dates in Postgres DB in a textual context

提问人:OldFred 提问时间:9/24/2023 最后编辑:BergiOldFred 更新时间:9/24/2023 访问量:26

问:

我有一个带有“日期”列的表,用于在用户完成当天的事件时存储数据:

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 行的子集。

我完全被困住了!

PostgreSQL 间隙和孤岛

评论


答: 暂无答案