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

Funkcja Oracle Lag z parametrem dynamicznym

Zakładam dodatkową kolumnę col0 który zawiera oczywiste kryteria porządkowania danych, takie jak col1 przykładowe dane nie są właściwie uporządkowane (powtarzane, końcowe wartości A i E ).

Uwielbiam MODEL klauzulę dla tego rodzaju celów. Następujące zapytanie daje oczekiwany wynik:

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)])
  )

Wynik:

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

Uwaga na temat klauzuli MODEL a podejść opartych na funkcjach okna

Chociaż powyższe wygląda fajnie (lub przerażająco, w zależności od twojego punktu widzenia), z pewnością powinieneś preferować podejście oparte na funkcjach okna, które jest widoczne w innych eleganckich odpowiedziach nop77svk (przy użyciu LAST_VALUE() IGNORE NULLS ) lub MT0 (przy użyciu LAG() IGNORE NULLS ) . Omówiłem te odpowiedzi bardziej szczegółowo w tym poście na blogu .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Link Rozpocznij nie działa na serwerze Oracle 11g

  2. Oracle 12c:Jak zmienić istniejącą kolumnę klucza podstawowego na kolumnę tożsamości?

  3. Błąd wyjścia SQL Fiddle

  4. Przekazywanie tablicy danych jako parametru wejściowego do procedury Oracle

  5. Oracle SQL tworzący różne poziomy danych z jednej tabeli