[英]SQL - aggregating rows of data
下表列出了旅行的中間步驟,我希望匯總這些旅行,以便每人每天獲得一行。 中間步驟可能涉及到乘客在一個車站出入各種登機口,而這些登機口總是一個接一個地跟隨。
因此,在下表中,乘客1234在時間1071在車站5598退出,然后在時間1073在車站796進入(時間已編碼為數值)。 然后,他們在時間1086在站635退出,然后在時間1088在站5148進入。該特定乘客在旅途中有2條中間路段。 對於乘客5678,他們只有一條中間腿。
下表如下:
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,遍歷並進行分區,但是無法使其正常工作。 他們的關鍵是我需要確保在上表的階段2_exit和階段3中不填充只有1條中間腿的旅程。
應該注意的是,乘客在旅途中可能有多達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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.