sql >> データベース >  >> RDS >> PostgreSQL

重複する変数を使用して、日付が異なる複数の行を結合します(最初と最後の変更日をキャプチャするため)

    LAGの使用を検討してください ウィンドウ関数と条件付き集計は、複数のCTEと自己結合を介して結合します:

    WITH sub AS (
      SELECT "user"
           , "type"
           , "date"
           , CASE 
                WHEN LAG("type") OVER(PARTITION BY "user" ORDER BY "date") = "type"
                THEN 0
                ELSE 1
             END "shift"
      FROM myTable 
    ), agg AS (
       SELECT "user"
             , MIN(CASE WHEN shift = 1 THEN "date" END) AS min_shift_dt
             , MAX(CASE WHEN shift = 1 THEN "date" END) AS max_shift_dt
       FROM sub
       GROUP BY "user"
    )
    
    
    SELECT agg."user"
         , s1."type" AS first_type
         , s1."date" AS first_type_initial_date
         , s2."type" AS last_type
         , s2."date" AS last_type_initial_date
    FROM agg
    INNER JOIN sub AS s1
      ON agg."user" = s1."user"
      AND agg.min_shift_dt = s1."date"
      
    INNER JOIN sub AS s2
      ON agg."user" = s2."user"
      AND agg.max_shift_dt = s2."date"
    

    オンラインデモ

    user first_type first_type_initial_date last_type last_type_initial_date
    A モバイル 2019-01-10 00:00:00 デスクトップ 2021-01-03 00:00:00


    1. アラビア語のテキストをMySQLデータベースに保存する

    2. mysql_fetch_arrayとmysql_fetch_rowの違いは?

    3. ODP.NET2.111とODP.NET4.112を同じマシンに並べてインストールし、両方が同じデータベースサーバーを指すようにする方法

    4. Angular/PHPを使用してJSONオブジェクトをMySQLテーブルに挿入する