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

Błędna następna data z kolumny daty dla wszystkich klientów Oracle

Twoja klauzula okna patrzy na last_effective_dates we wszystkich Twoich danych. Musisz dodać partition by clause klauzula o ograniczeniu jej do aktualnego klienta:

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

A więc:

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;

Jeśli kiedykolwiek będziesz musiał uruchomić go dla więcej niż jednego appliance_info_id następnie musisz dodać to do klauzuli partition by clause też.

Używanie fikcyjnego dodatkowego rekordu do symulacji tego, co widzisz, dostarczanego przez 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
)
 

Twoje pierwotne zapytanie otrzyma:

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
 

a powyższe zapytanie partycjonujące otrzymuje:

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. Gdzie w Oracle przechowywane są klasy Java?

  2. Jak podłączyć JDBC do tns oracle?

  3. Zapytanie Oracle Insert w procedurze składowanej nie działa po wywołaniu z kodu znajdującego się za nim

  4. poprawka wstępna

  5. oratop