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 -各レベルの最小距離で値を検索します。
    • t2 -範囲が開始するかどうかを示すマーカーを追加します。
    • t3 -次にデータをグループ化するために使用する列を追加します。


    1. WHERE句を動的/プログラムでSQLに追加します

    2. SQLSecure4.0の一般提供の発表

    3. 結合テーブルからのフィルタリング

    4. 大きなテーブルではMySQLInsertのパフォーマンスが低下します