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

SQL-日付が接続されている場合に行をマージする

    このようなロジックはsumで使用できます 集計とlag ウィンドウは次のように機能します:

    select clientid, min(startdate) as startdate, max(enddate) as enddate
      from
    (
    select tt.*, sum(grp) over (order by clientid, startdate) sm 
      from
    (
      with t(clientid, startdate, enddate) as
      (
       select 1, date'2017-10-10', date'2017-10-12' from dual union all
       select 1, date'2017-10-12', date'2017-10-13' from dual union all
       select 1, date'2017-10-13', date'2017-10-17' from dual union all  
       select 1, date'2017-11-10', date'2017-11-17' from dual union all  
       select 1, date'2017-11-17', date'2017-11-23' from dual union all  
       select 1, date'2017-12-12', date'2017-12-14' from dual union all
       select 2, date'2017-11-10', date'2017-11-15' from dual union all  
       select 2, date'2017-12-01', date'2017-12-02' from dual union all  
       select 2, date'2017-12-02', date'2017-12-05' from dual
      )
     select clientid, 
            decode(nvl(lag(enddate) over 
                       (order by enddate),startdate),startdate,0,1) 
                       as grp, --> means prev. value equals or not 
            row_number() over (order by clientid, enddate) as rn, startdate, enddate
        from t
    ) tt
    order by rn
    ) 
    group by clientid, sm 
    order by clientid, enddate;
    
    CLIENTID    STARTDATE   ENDDATE
    ----------  ----------  ----------
    1           10.10.2017  17.10.2017
    1           10.11.2017  23.11.2017
    1           12.12.2017  14.12.2017
    2           10.11.2017  15.11.2017
    2           01.12.2017  05.12.2017
    

    Rextesterデモ

    理解を深めるためのステップバイステップのクエリ実行



    1. Hibernateエンティティの主キーとしてUUIDを使用するにはどうすればよいですか?

    2. C# コードを使用して SQL Server データベースを復元する方法

    3. ORACLE SQLは、2つのselectステートメントから取得された2つの値の差を取得します

    4. SQLServer2017の復元