sql >> Databáze >  >> RDS >> Oracle

SQL Challenge/Puzzle:Jak sloučit vnořené rozsahy?

Řešení Oracle:

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

Výstup odpovídá požadavku. Moje angličtina není zdaleka dobrá, takže je těžké to vysvětlit, ale zkusme to:

  • l - generátor čísel,
  • r - data z ranges s počítanou vzdáleností,
  • t1 - najde hodnotu s minimální vzdáleností pro každý lvl,
  • t2 - přidá značky udávající, zda začíná rozsah,
  • t3 - přidá sloupec, který příště použijeme pro seskupování dat.


  1. wampserver 2.2 64x nemohl provést položku nabídky (interní chyba)[Výjimka] Nelze provést akci spuštění:název adresáře je neplatný

  2. Dapper - volání funkce Oracle schema.package.function

  3. Django manytomany dotaz podivné chování

  4. Vnitřní spojení MySQL mezi dvěma tabulkami