Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mendapatkan tanggal berikutnya yang salah dari kolom tanggal untuk semua pelanggan Oracle

Klausa jendela Anda melihat last_effective_dates di semua data Anda. Anda perlu menambahkan partition by klausa untuk membatasinya ke pelanggan saat ini:

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

Jadi:

  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;

Jika Anda perlu menjalankannya untuk lebih dari satu appliance_info_id maka Anda harus menambahkannya ke partition by clause juga.

Menggunakan rekaman ekstra dummy untuk mensimulasikan apa yang Anda lihat, disediakan melalui 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
)

kueri asli Anda mendapatkan:

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

dan kueri partisi-oleh di atas mendapatkan:

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. spring boot hibernate query kesalahan pengguna yang tidak valid

  2. Fungsi NLS_COLLATION_NAME() di Oracle

  3. 11 Cara Menemukan Baris Duplikat yang memiliki Kunci Utama di Oracle

  4. Agen Diblokir

  5. Oracle SEQUENCE.Masalah Currval di CodeIgniter