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

Nhận sai ngày tiếp theo từ cột ngày cho tất cả khách hàng Oracle

Mệnh đề cửa sổ của bạn đang xem last_effective_dates trên tất cả dữ liệu của bạn. Bạn cần thêm phân vùng partition by điều khoản để hạn chế nó đối với khách hàng hiện tại:

  OVER (PARTITION BY nm.CUSTOMER_ID
        ORDER BY nm.LATEST_EFFECTIVE_DATE
        RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)

Vì vậy:

  SELECT NM.CUSTOMER_ID customer_id,
     NM.LATEST_EFFECTIVE_DATE start_date,
     NVL (
        CASE
           WHEN nm.LATEST_EFFECTIVE_DATE IS NULL
           THEN
              TO_DATE ('12/12/9999', 'dd/mm/yyyy')
           ELSE
              FIRST_VALUE (
                 nm.LATEST_EFFECTIVE_DATE)
              OVER (PARTITION BY nm.CUSTOMER_ID
                    ORDER BY nm.LATEST_EFFECTIVE_DATE
                    RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
        END,
        TO_DATE ('12/12/9999', 'dd/mm/yyyy'))
        end_date,
     NM.PRESENT_QUANTITY PRESENT_quantity
FROM nm_cust_appliance_history nm
WHERE NM.APPLIANCE_INFO_ID = 10484
ORDER BY customer_id, start_date;

Nếu bạn cần chạy nó cho nhiều hơn một appliance_info_id thì bạn sẽ cần thêm điều đó vào partition by clause quá.

Sử dụng một bản ghi bổ sung giả để mô phỏng những gì bạn đang thấy, được cung cấp qua CTE:

with nm_cust_appliance_history(appliance_info_id, customer_id, latest_effective_date, present_quantity) as (
  select 10484, 96, date '2009-12-20', 10 from dual
  union all select 10484, 96, date '2014-11-18', 12 from dual
  union all select 10484, 96, date '2015-11-26', 14 from dual
  union all select 10484, 42, date '2009-12-21', 15 from dual
)

truy vấn ban đầu của bạn nhận được:

CUSTOMER_ID START_DATE END_DATE   PRESENT_QUANTITY
----------- ---------- ---------- ----------------
         42 2009-12-21 2014-11-18               15
         96 2009-12-20 2009-12-21               10
         96 2014-11-18 2015-11-26               12
         96 2015-11-26 9999-12-12               14

và truy vấn theo phân vùng ở trên nhận được:

CUSTOMER_ID START_DATE END_DATE   PRESENT_QUANTITY
----------- ---------- ---------- ----------------
         42 2009-12-21 9999-12-12               15
         96 2009-12-20 2014-11-18               10
         96 2014-11-18 2015-11-26               12
         96 2015-11-26 9999-12-12               14



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm SQRT () trong Oracle

  2. Thay đổi mật khẩu người dùng qua jdbc. Sự cố với đường chuyền có chứa dấu chấm hỏi

  3. C #:Không thể truyền đối tượng từ DbNull sang các kiểu khác

  4. Làm cách nào để xóa các bản sao khỏi danh sách được phân tách bằng dấu cách bởi Oracle regexp_replace?

  5. Cách tốt nhất để thoát các ký tự không định dạng trong to_char của Oracle là gì?