Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hàm Lag của Oracle với tham số động

Tôi giả sử một cột bổ sung col0 chứa tiêu chí sắp xếp rõ ràng cho dữ liệu của bạn, như col1 của bạn dữ liệu mẫu không thực sự được sắp xếp chính xác (các giá trị lặp lại, theo sau của AE ).

Tôi thích MODEL điều khoản cho các loại mục đích này. Truy vấn sau đây mang lại kết quả mong đợi:

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

Kết quả:

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

Lưu ý về mệnh đề MODEL so với phương pháp tiếp cận dựa trên hàm cửa sổ

Mặc dù phần trên trông có vẻ thú vị (hoặc đáng sợ, tùy thuộc vào quan điểm của bạn), bạn chắc chắn nên thích sử dụng chức năng đánh giá dựa trên hàm cửa sổ như được hiển thị bởi các câu trả lời thanh lịch khác bởi nop77svk (sử dụng LAST_VALUE() IGNORE NULLS ) hoặc MT0 (sử dụng LAG() IGNORE NULLS ) . Tôi đã giải thích những câu trả lời này chi tiết hơn trong bài đăng trên blog này .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi bộ điều hợp giao thức TNS khi khởi động Oracle SQL * Plus

  2. Cách xếp hàng trên bảng Oracle AQ khi cam kết với Java và sử dụng với ứng dụng khách JMS

  3. khoảng thời gian định dạng với to_char

  4. Oracle:SQL động

  5. Làm thế nào để gọi gói từ php có thủ tục trong oracle bằng cách sử dụng trình điều khiển oci?