Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL Challenge/Puzzle:Wie werden verschachtelte Bereiche zusammengeführt?

Oracle-Lösung:

with l as ( select level lvl from dual connect by level < 66 ),
     r as ( select range_start r1, range_end r2, range_val v, 
                    range_end - range_start + 1 cnt 
              from ranges ),
     t1 as (select distinct lvl, 
                   nvl(max(v) keep (dense_rank first order by cnt) 
                              over (partition by lvl), '*' ) m
              from l left join r on lvl between r1 and r2 ),
     t2 as (select lvl, m, case when lag(m) over (order by lvl) <> m then 0 else 1 end mrk 
              from t1),
     t3 as (select lvl, m, lvl - sum(mrk) over (order by lvl) grp from t2)
select min(lvl) r1, max(lvl) r2, nullif(min(m), '*') val
  from t3 group by grp order by r1

Die Ausgabe erfolgt wie gewünscht. Mein Englisch ist alles andere als gut, also ist es schwer zu erklären, aber versuchen wir es mal:

  • l - Zahlengenerator,
  • r - Daten aus ranges mit gezählter Entfernung,
  • t1 - findet Wert mit minimaler Entfernung für jedes Level,
  • t2 - fügt Markierungen hinzu, die angeben, ob der Bereich beginnt,
  • t3 - fügt eine Spalte hinzu, die wir als nächstes zum Gruppieren von Daten verwenden werden.