SQL开始和结束日期和行转换

时间:2018-10-01 12:40:24

标签: sql

                            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行的表。

所以背后的逻辑是: 当下一行代表前一行的连续性时,表示它们应该在同一行中,并且 开始日期应该是该行的开始,结束日期应该是该连续性的结束。

1 个答案:

答案 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";

db<>fiddle