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

連続する行をPostgresqlとマージする

    これがこの問題を解決するための1つの方法です。 1つのレコードがしないかどうかを決定するフラグを作成します 前のものと重複します。これがグループの始まりです。次に、このフラグの累積合計を取得し、それをグループ化に使用します。

    select user_id, min(begin_at) as begin_at, max(end_at) as end_at
    from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
          from (select s.*,
                       (case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
                             then 0 else 1
                        end) as startflag
                from slots s
               ) s
         ) s
    group by user_id, grp;
    

    こちら SQLフィドルです。



    1. 安全なTO_NUMBER()

    2. PL/SQLストアドプロシージャでコンマ区切りの文字列を分割する

    3. 空のテーブルのMAX()をNULLではなく0として扱う方法

    4. 同じ列名を持つ2つのテーブルからのSQLSelectは、nullでない場合にのみ列を返します