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

ピリオドによる Oracle SQL 行連結

    これは一種のギャップアンドアイランド問題です。 lag() を使用できます そして累積合計:

    select id, min(laufd), max(nextdt),
           row_number() over (partition by id order by min(laufd)) as period
    from (select t.*,
                 sum(case when prev_nextdt >= laufd - interval '2' day then 0 else 1 end) over
                     (partition by id order by order_row) as grp
          from (select t.*,
                       lag(nextdt) over (partition by id order by order_row) as prev_nextdt
                from t
               ) t
         ) t
    group by grp, id;
      

    編集:

    値が文字列として保存されている場合は、次を使用します:

    select id, min(laufd), max(nextdt),
           row_number() over (partition by id order by min(laufd)) as period
    from (select t.*,
                 sum(case when prev_nextdt >= laufd - interval '2' day then 0 else 1 end) over
                     (partition by id order by order_row) as grp
          from (select t.id, t.order_row, -- any other columns you need
                       to_date(laufd, 'YYYYMMDD') as laufd,
                       to_date(nextdt, 'YYYYMMDD') as next_dt,
                       lag(to_date(nextdt, 'YYYYMMDD')) over (partition by id order by order_row) as prev_nextdt
                from t
               ) t
         ) t
    group by grp, id;
      

    1. postgresqlを使用してsqlalchemyで配列リテラルの型を明示的にキャストする方法は?

    2. 最後のエントリによるMySQLグループ

    3. MySQLはEC2で非常に遅い

    4. MySQLアレイ:これは実行できますか?