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

Oracle Lag функция с динамичен параметър

Предполагам допълнителна колона 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не може да се свърже с Oracle чрез VBA - SQLSetConnectAttr на драйвера е неуспешен

  2. Кой е най-добрият начин за свързване между android и oracle база данни?

  3. python:свързване към база данни на Oracle, използвайки портфейла/tnsnames на Oracle

  4. вътрешно присъединяване с група по израз в oracle sql

  5. Конфигуриране на Pentaho Data Integration за използване на Oracle Wallet за Oracle Cloud