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"
我在旅程的中间步骤中有以下 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"