2016-06-22 7 views
0

1人1日1列に集計したい旅行の中間ステップについて、次の表を用意しました。中間ステップは、乗客が出て行き、いつも乗り移り続けるステーションに様々なゲートに入ることを含むかもしれない。SQL集約データ行

したがって、以下の表において、乗客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 

と私はそれがこのように見えるように取得したい:

の表は以下の通りである。私はオーバー、FIRST_VALUEを試してみました

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 

と、パーティションが、取得することはできませんそれは機能する。彼らは重要なのは、中間の脚が1つしかない旅程が上記の表のステージ2_exitとステージ3に設定されていないことを確認する必要があることです。

旅客は旅に中間脚を5つまで持ちます(例では3つではありません)。

+1

特定の日に3つの中間脚がある場合はどうなりますか?または4?あなたが受け入れることができる足の数を制限することが安全であることは確かですか? –

+0

理論的には3本の中間脚でなければならないかもしれませんが、それ以上の脚を考慮する必要があります(最大5でなければなりません) – JassiL

答えて

0

これはあなたの結果を得るのに役立ちます。

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" 
+0

美しい!出来た!迅速な対応に感謝します – JassiL