Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

SQL Challenge/Puzzle:Bagaimana cara menggabungkan rentang bersarang?

Solusi 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

Outputnya seperti yang diminta. Bahasa Inggris saya jauh dari baik, jadi sulit untuk dijelaskan, tetapi mari kita coba:

  • l - pembuat angka,
  • r - data dari ranges dengan jarak terhitung,
  • t1 - menemukan nilai dengan jarak minimal untuk setiap lvl,
  • t2 - menambahkan penanda yang memberi tahu apakah jangkauan dimulai,
  • t3 - menambahkan kolom yang selanjutnya akan kita gunakan untuk mengelompokkan data.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan data ke dalam Clob menggunakan Hibernate di Oracle 10g

  2. Cross Gabung di Oracle

  3. Ubah nilai simpul XML - UpdateXML setara untuk Oracle 12c

  4. Oracle 11g OFFSET FETCH memberikan kesalahan

  5. Oracle SELECT TOP 10 catatan