簡體   English   中英

SQL-匯總數據行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM