Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL предизвикателство/пъзел:Как да обединим вложени диапазони?

Решение на 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

Резултатът е както е поискано. Английският ми далеч не е добър, така че е трудно да го обясня, но нека опитаме:

  • l - генератор на числа,
  • r - данни от ranges с преброено разстояние,
  • t1 - намира стойност с минимално разстояние за всеки lvl,
  • t2 - добавя маркери, показващи дали диапазонът започва,
  • t3 - добавя колона, която следва да използваме за групиране на данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Показване на свързаните стойности в SQL заявка

  2. Oracle Unicode Spooling

  3. Свързваща променлива към името на таблицата с cx_Oracle

  4. Как да замените първите три знака на низ в oracle

  5. нежелано водещо празно място в числовия формат на Oracle