Oracle
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешен брой или типове аргументи грешка при извикване на процедура

  2. преодоляване на ограничението от 32k при вмъкване на параметър oracle clob IN с помощта на spring StoredProcedure

  3. PL/SQL групово събиране с клауза LIMIT в базата данни на Oracle

  4. Как да използвам константа на пакета в SQL оператор SELECT?

  5. защо заявката отнема твърде много време