SQL - 聚合数据行

SQL - aggregating rows of data

我在旅程的中间步骤中有以下 table,我想汇总这些步骤,使每人每天一行。中间步骤可能涉及乘客离开和进入车站的各个门,这些门总是一个接一个。

所以,在下面的table中,乘客1234在时间1071在5598站下车,然后在时间1073在796站上车(时间编码为数值)。然后他们在时间 1086 在 635 站下车,然后在时间 1088 在 5148 站进站。这位特定乘客在他们的旅程中有 2 个中间航段。 5678号乘客,他们只有一个中间航段。

table如下:

 ID    day    station    time    type   
1234    133    5598      1071    exit
1234    133    796       1073    entry
1234    133    635       1086    exit 
1234    133    5148      1088    entry 
5678    133    8909      1305    exit 
5678    133    5158      1306   entry 

我想让它看起来像这样:

ID    day    stage1_exittime    stage1_exitstation    stage2_entrytime    stage2_entrystation    stage2_exittime    stage2_exitstation    stage3_entrytime    stage3_entrystation
1234  133    1071               5598                  1073                796                     1086                635                 1088                 5148
5678  133    1305               8909                  1306                5158                    0                    0                   0                    0

我已尝试 first_value,over 和 partition by,但无法正常工作。他们的关键是我需要确保那些只有 1 个中间腿的旅程不会在上面 table 的阶段 2_exit 和阶段 3 中填充。

应该注意的是,乘客在他们的旅程中可能有多达 5 个中间腿(不是示例所示的 3 个)。

这应该可以帮助您获得结果。

row_number 对进入和退出进行排序,您只需按类型获取正确的 row_number 即可确定顺序。

SELECT  "ID",
        "day",
        MAX(CASE WHEN Rn = 1 AND "type" = 'exit' THEN "time" END) AS stage1_exittime, 
        MAX(CASE WHEN Rn = 1 AND "type" = 'exit' THEN "station" END) AS stage1_exitstation,
        MAX(CASE WHEN Rn = 1 AND "type" = 'entry' THEN "time" END) AS stage2_entrytime,
        MAX(CASE WHEN Rn = 1 AND "type" = 'entry' THEN "station" END) AS stage2_entrystation,
        MAX(CASE WHEN Rn = 2 AND "type" = 'exit' THEN "time" END) AS stage2_exittime,
        MAX(CASE WHEN Rn = 2 AND "type" = 'exit' THEN "station" END) AS stage2_exitstation,
        MAX(CASE WHEN Rn = 2 AND "type" = 'entry' THEN "time" END) AS stage3_entrytime,
        MAX(CASE WHEN Rn = 2 AND "type" = 'entry' THEN "station" END) AS stage3_entrystation
FROM    (   
            SELECT  "ID",
                    "station",
                    "time",
                    "type",
                    "day",
                    ROW_NUMBER() OVER (PARTITION BY "ID", "day", "type" ORDER BY "time") AS Rn
            FROM    myTable 
        ) mt
GROUP BY "ID",
        "day"