2016-10-12 5 views
0

Ich versuche, Daten auf einem Rolling Datum ausgewählt und vorherigen 4 Monate Kriterien zu kennzeichnen. Wie schreibe ich einen Fall, wenn das sagtFall, wenn zwischen Daten

Case when X=1 and Y=2 And between Date- 4months Then '1' 
    When X =2 and Date(Year/month)- 4monthsDate Then '2' 
END) AS Flag 

GROUP BY MONTHOFDATE 
+0

Bitte geben Sie die gleichen Beispieldaten und das gewünschte Ergebnis an. Bitte posten Sie auch einen vollständigen, reduzierten Code. Sie können sich [mcve] – Aleksej

Antwort

1

Ihre beste Wette es die ADD_MONTHS Funktion zu verwenden:

CASE 
    WHEN X = 1 AND 
     Y = 2 AND 
     SOME_DATE BETWEEN ADD_MONTHS(SYSDATE, -4) AND SYSDATE 
    THEN '1' 
    WHEN X = 2 AND 
     SOME_DATE BETWEEN ADD_MONTHS(SYSDATE, -4) AND SYSDATE 
    THEN '2' 
END AS FLAG 

Best of luck.

+0

ansehen. Um zu verdeutlichen: Was Bob bedeutet, ist ADD_MONTHS auf SYSDATE, um die Grenzen des rollenden viermonatigen Fensters zu definieren. Wenn Sie viele Daten und Performance-Angelegenheiten haben, sollten Sie einen Index für "SOME_DATE" haben und Sie sollten nicht ADD_MONTHS oder irgendeine andere Funktion oder Datumsarithmetik am SOME_DATE verwenden; Machen Sie die ganze Arithmetik auf der "rechten Seite" der Vergleiche. Zum Beispiel, nicht "gruppieren von MONTHOFDATE" wie Sie in Ihrem Versuch haben - vorausgesetzt, Sie beabsichtigen, einige Extrakt-Funktion verwenden, um den Monat von SOME_DATE abrufen. Das würde verhindern, dass die Oracle-Engine den Index am SOME_DATE verwendet. – mathguy

+0

Bedeutet das Obige, dass X = 1 die gesamten 4 Monate des Walzdatums? – Tinkinc