START END
'event' '2018-06-11' to '2018-06-12'
'event' '2018-06-13' to '2018-06-16'
'event' '2018-06-19' to '2018-06-20'
'event' '2018-06-23' to '2018-06-25'
'event' '2018-06-27' to '2018-06-28'
'event' '2018-06-29' to '2018-06-30'
我有这张桌子,我想用SQL语句像这样转换它:
START END
'event' '2018-06-11' to '2018-06-12' row1
'event' '2018-06-13' to '2018-06-16' row1
'event' '2018-06-19' to '2018-06-20' row2
'event' 2018-06-23' to '2018-06-25' row3
'event' '2018-06-27' to '2018-06-28' row4
'event' '2018-06-29' to '2018-06-30' row4
这应该成为4行的表。
所以背后的逻辑是: 当下一行代表前一行的连续性时,表示它们应该在同一行中,并且 开始日期应该是该行的开始,结束日期应该是该连续性的结束。
答案 0 :(得分:0)
如果您的DBMS支持窗口功能,则可以使用lag()
来检查上一个结束点与当前开始点之间的差异。如果小于或等于1,则记录0
,否则记录1
。然后使用累积sum()
添加这些值。
SELECT *,
'row' || sum("not_a_follow_up") OVER (ORDER BY "start",
"end")
FROM (SELECT *,
CASE
WHEN "start" - lag("end") OVER (ORDER BY "start",
"end") <= 1 THEN
0
ELSE
1
END "not_a_follow_up"
FROM "elbat") "x";