2017-05-20 23 views
0

現在、同じIDを持つテーブルのサブセットに対して複数行の出力(単純最大/最小計算ではない)を取得するためにデータを集計するSQL文があります。次のスナップは、場所が変更されたときに基づいて特定のIDで取得された移動を計算します。私は、このSQL文の出力を含むビューを作成したいと思いますサブクエリを複数回実行してPostgreSQLビューを作成する

WITH id_locations AS (
    SELECT created_at, id, location 
     FROM locations 
     WHERE id = 1 
), travel_locations AS (
    SELECT created_at, id, location, ROW_NUMBER() OVER(ORDER BY created_at) AS row_num 
     FROM id_locations 
     WHERE 
      created_at IN (
       SELECT min(created_at) 
        FROM id_locations 
        GROUP BY location 
      ) OR created_at IN (
       SELECT max(created_at) 
        FROM id_locations 
        GROUP BY location 
      ) 
) 
SELECT a.id id, a.created_at departed_at, b.created_at arrived_at, a.location departure_location, b.location arrival_location 
    FROM travel_locations AS a 
    INNER JOIN travel_locations AS b 
     ON a.row_num = b.row_num - 1 
    WHERE a.location <> b.location; 

Data 
id   created_at location 
1   1   1 
1   2   1 
1   3   2 
1   4   2 
1   5   5 
1   6   5 
1   7   5 
1   8   5 
2   1   1 
2   2   1 
2   3   1 
2   4   1 
2   5   3 
2   6   3 
2   7   3 
2   8   3 

Desired Output 
id   departed_at arrived_at departure_location arrival_location 
1   2   3   1     2 
1   4   5   2     5 
2   4   5   1     3 

、ID

でグループ化されたテーブルのすべてのサブセットに走った生のSQLでこれを行うにはどのような方法があり、またはだろう私はいくつかのSQLクライアントで可能なすべてのIDを繰り返し、同じクエリを実行し、将来の参照のためにテーブルに結果を挿入する必要がありますか?私はあなたが取得しようとしている何を参照

+0

独自のIDはありますか? – ekaerovets

+1

あなたは 'group by'を探していると思います。いくつかのサンプルデータと期待される結果を投稿する。 –

+0

いいえ、おそらく例のための最善の列名ではありませんでした。id_groupステートメントは多くの行になります。実行するステートメントでは、1つのidのみを持つサブセットが必要です。 –

答えて

0
SELECT id, 
     max_created_at AS departed_at, 
     next_created_at AS arrived_at, 
     location AS departure_location, 
     next_location AS arrival_location 
FROM 
    (SELECT id, 
      created_at, 
      location, 
      max(created_at) over(partition by id,location) AS max_created_at, 
      lead(created_at) over(partition by id order by location,created_at) AS next_created_at, 
      lead(location) over(partition by id order by location,created_at) AS next_location 
    FROM locations) t 
WHERE max_created_at=created_at AND next_created_at IS NOT NULL 

Sample Demo

はPostgreSQL 9.6を使用しています

maxのcreated_atと対応する位置と次のcreated_at、idの場所です。

  • maxウィンドウ機能を使用して、各ID、ロケーションに対してmax created_atを取得します。
  • leadを使用して、各IDに対して次の行(created_at順)からlocation、created_at値を取得します。
  • max_created_atが現在の行のcreated_atと等しく、next_created_atがnullでない行を取得します。
関連する問題