Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL Challenge/Puzzle:Jak połączyć zagnieżdżone zakresy?

Rozwiązanie 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

Wynik jest zgodny z żądaniem. Mój angielski jest daleki od dobrego, więc trudno to wytłumaczyć, ale spróbujmy:

  • l - generator liczb,
  • r - dane z ranges ze zliczoną odległością,
  • t1 - znajduje wartość z minimalną odległością dla każdego poziomu,
  • t2 - dodaje znaczniki informujące o rozpoczęciu zasięgu,
  • t3 - dodaje kolumnę, której następnie użyjemy do grupowania danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liczenie nr. rekordów z wielu tabel; Baza danych Oracle

  2. zapytanie dotyczące dystrybucji płatności Oracle sql

  3. Brak dostawcy Oracle dla Oledb w powłoce VS 2015

  4. Wartości oddzielone przecinkami do funkcji IN w Oracle

  5. Błąd otwierania połączenia Oracle podczas łączenia z kodu .NET