【发布时间】:2017-01-06 14:26:58
【问题描述】:
我正在尝试根据person 识别日期中的连续序列,以及该序列的总和amount。我的records 表如下所示:
person start_date end_date amount
1 2015-09-10 2015-09-11 500
1 2015-09-11 2015-09-12 100
1 2015-09-13 2015-09-14 200
1 2015-10-05 2015-10-07 2000
2 2015-10-05 2015-10-05 300
2 2015-10-06 2015-10-06 1000
3 2015-04-23 2015-04-23 900
结果查询应该是这样的:
person sequence_start_date sequence_end_date amount
1 2015-09-10 2015-09-14 800
1 2015-10-05 2015-10-07 2000
2 2015-10-05 2015-10-06 1400
3 2015-04-23 2015-04-23 900
下面,我可以使用 LAG 和 LEAD 来识别序列 start_date 和 end_date,但我没有办法聚合 amount。我假设答案将涉及某种ROW_NUMBER() 窗口函数,该函数将按序列分区,我只是不知道如何使序列可被函数识别。
SELECT
person
,COALESCE(sequence_start_date, LAG(sequence_start_date, 1) OVER (ORDER BY person, start_date)) AS "sequence_start_date"
,COALESCE(sequence_end_date, LEAD(sequence_end_date, 1) OVER (ORDER BY person, start_date)) AS "sequence_end_date"
FROM
(
SELECT
person
,start_date
,end_date
,CASE WHEN LAG(end_date, 1) OVER (PARTITION BY person ORDER BY start_date) + interval '1 day' = start_date
THEN NULL
ELSE start_date
END AS "sequence_start_date"
,CASE WHEN LEAD(start_date, 1) OVER (PARTITION BY person ORDER BY start_date) - interval '1 day' = end_date
THEN NULL
ELSE end_date
END AS "sequence_end_date"
,amount
FROM records
) sq
【问题讨论】:
-
现有查询中的子查询生成的
sequence_start_date和sequence_end_date值与这些列名不一致。 -
您的数据似乎有点不一致。在某些情况下,一行的开始日期与前一行的结束日期相同,顺序相同,但在其他情况下,开始日期比前一个结束日期晚一天。这是数据中的错误,还是两种情况都需要考虑?
标签: sql postgresql window-functions gaps-and-islands