sql >> データベース >  >> RDS >> Oracle

動的パラメータを使用したOracleLag関数

    追加の列col0を想定しています col1のように、データの明確な順序付け基準が含まれています サンプルデータは実際には正しく順序付けられていません(Aの繰り返しの末尾の値 およびE

    MODELが大好きです これらの種類の目的のための条項。次のクエリは期待される結果をもたらします:

    WITH t(col0, col1, col2, col3, col4) AS (
      SELECT 1, 'A', 0, 1, 5 FROM DUAL UNION ALL
      SELECT 2, 'B', 0, 4, 0 FROM DUAL UNION ALL
      SELECT 3, 'C', 2, 0, 0 FROM DUAL UNION ALL
      SELECT 4, 'D', 0, 0, 0 FROM DUAL UNION ALL
      SELECT 5, 'E', 3, 5, 0 FROM DUAL UNION ALL
      SELECT 6, 'F', 0, 3, 0 FROM DUAL UNION ALL
      SELECT 7, 'G', 0, 3, 1 FROM DUAL UNION ALL
      SELECT 8, 'A', 0, 1, 5 FROM DUAL UNION ALL
      SELECT 9, 'E', 3, 5, 0 FROM DUAL
    )
    SELECT * FROM t
    MODEL
      DIMENSION BY (row_number() OVER (ORDER BY col0) rn)
      MEASURES (col1, col2, col3, col4)
      RULES (
        col2[any] = DECODE(col2[cv(rn)], 0, NVL(col2[cv(rn) - 1], 0), col2[cv(rn)]),
        col3[any] = DECODE(col3[cv(rn)], 0, NVL(col3[cv(rn) - 1], 0), col3[cv(rn)]),
        col4[any] = DECODE(col4[cv(rn)], 0, NVL(col4[cv(rn) - 1], 0), col4[cv(rn)])
      )
    

    結果:

    RN   COL1  COL2  COL3  COL4
    1    A     0     1     5
    2    B     0     4     5
    3    C     2     4     5
    4    D     2     4     5
    5    E     3     5     5
    6    F     3     3     5
    7    G     3     3     1
    8    A     3     1     5
    9    E     3     5     5
    

    SQLFiddle

    MODEL句とウィンドウ関数ベースのアプローチに関する注意

    上記はかっこいい(またはあなたの視点によっては怖い)ように見えますが、 nop77svk(LAST_VALUE() IGNORE NULLSを使用 ) または MT0(LAG() IGNORE NULLSを使用 ) 。 これらの回答についてはこのブログ投稿で詳しく説明しました



    1. mysqlプロキシソックス

    2. Railsクエリインターフェイスのどこで句が発行されますか?

    3. Nodejsノード-mysqlモジュールがデータベースに接続していません

    4. foreachループを使用して同じIDの複数の行を更新します