2016-03-23 6 views
2

Ich möchte nur die Zeile auswählen, in der das Eingabedatum zwischen dem Beg_Datum und Enddatum liegt. Da es jedoch mehrere Zeilen gibt, in denen dies der Fall sein kann, möchte ich das maximale Enddatum angeben sind mehrere Zeilen. Mit den folgenden Informationen möchte ich, dass die erste Zeile nur ausgewählt wird, obwohl das Datum zwischen dem Datum und dem Enddatum der zweiten Zeile liegt.Verwenden von nvl und max zum Suchen eindeutiger Werte

Zusätzlich, wenn ich die Max Funktion verwende, kann ich am Ende den Nullwert auswählen und eine grp_id wird nicht zurückgegeben, da das Enddatum Null ist. Ich werde wahrscheinlich die nvl Funktion irgendwo verwenden müssen, aber nicht sicher wo.

Customer_Nbr: 20080909

Datum: 25-Jun-95

Customer_Nbr Grp_Id Beg_Date End_Date 
12345689  9  21-MAY-95 24-FEB-97 
12345689  9  21-MAY-95 24-FEB-96 
12345689  9  27-JUN-04 null 

Bisher funktioniert das einen Nicht-Null end_date Wert zu erhalten.

SELECT grp_id 
    FROM table1 
    WHERE customer_nbr = '12345689' 
    AND to_date('06/27/2004','MM/DD/YYYY') 
    BETWEEN beg_date AND nvl(end_date,to_date('12/31/9999','MM/DD/YYYY')); 

Antwort

2
SELECT grp_id 
    FROM (SELECT grp_id, MAX(end_date) over(PARTITION BY 1) AS max_end_date, 
       end_date 
      FROM table1 
      WHERE customer_nbr = '12345689' 
      AND to_date('06/27/2004', 'MM/DD/YYYY') BETWEEN beg_date AND 
       nvl(end_date, to_date('06/27/2004', 'MM/DD/YYYY'))) 
WHERE end_date = max_end_date 

Sie wissen müssen max_end auf jeder Zeile wählen, wenn u analytische Funktion über verwenden (Partition ..), u haben max() Funktion mit dem gleichen Ergebnis auf overy Reihe und dann filtern, um nur über end_date = max_end_date

(und Eingabedatum 2004.06.27 muss von derselben in NVL-Funktion)

0

Sie könnten so:

Wo Datum zwischen start_date und NVL (end_date, Datum)

Verwandte Themen