sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL-radsammansättning efter punkter

Detta är en typ av luckor-and-öar-problem. Du kan använda lag() och sedan en kumulativ summa:

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;

EDIT:

Om värdena lagras som strängar, använd:

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. Med hjälp av CodeIgniter get_where för att kedja 'and' och 'or'-satser

  2. Hybrid molnreplikering för MySQL för hög tillgänglighet

  3. Hur man ställer in schemakollation i MySQL för japanska

  4. Betyder jokertecken i kolumnen längst till vänster i det sammansatta indexet att återstående kolumner i indexet inte används i indexsökning (MySQL)?