Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Łączenie wierszy Oracle SQL według okresów

Jest to rodzaj problemu luk i wysp. Możesz użyć lag() a następnie suma skumulowana:

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;

EDYCJA:

Jeśli wartości są przechowywane jako ciągi, użyj:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Brak dostawcy Oracle dla Oledb w powłoce VS 2015

  2. Dostawca danych Oracle ustala proces roboczy IIS, gdy witryna internetowa jest zatrzymana

  3. Jak wyeksportować przeanalizowane dane z Pythona do tabeli Oracle w SQL Developer?

  4. Funkcja JSON_TABLE() w Oracle

  5. Ustawienie NLS_LANG dla cienkiego sterownika JDBC?