sql >> Database >  >> RDS >> Oracle

SQL-uitdaging/puzzel:hoe geneste bereiken samenvoegen?

Oracle-oplossing:

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

Uitgang is zoals gevraagd. Mijn Engels is verre van goed, dus het is moeilijk uit te leggen, maar laten we het proberen:

  • l - nummergenerator,
  • r - gegevens uit ranges met getelde afstand,
  • t1 - vindt waarde met minimale afstand voor elk niveau,
  • t2 - voegt markeringen toe die aangeven of het bereik begint,
  • t3 - voegt kolom toe die we hierna zullen gebruiken voor het groeperen van gegevens.


  1. i18n-gegevens ophalen met fallback-taal

  2. Mysql-tabel maken met expliciete standaardtekenset, wat als ik dat niet doe?

  3. Laravel - vul ontbrekende datums en tellingen uit de database in

  4. Hoe een ssh-tunnel in ruby ​​te maken en vervolgens verbinding te maken met de mysql-server op de externe host