Wenn ich Ihre Anforderungen richtig verstehen, dann sollte diese Abfrage geben, was Sie wollen:
WITH current_running AS (
SELECT to_date('8/1/2017','mm/dd/rrrr') As Current_running_date
FROM dual
)
SELECT * FROM (
SELECT t.*,
row_number() Over (partition by id order by end_date desc) As rn,
c.Current_running_date
FROM Table1 t
JOIN current_running c
ON c.Current_running_date >= ANY(t.Start_Date, t.End_Date)
)
WHERE rn = 1
;
Demo: http://sqlfiddle.com/#!4/33de0/10
Für current_running_date = 2017-08-01
es gibt:
| ID | START_DATE | END_DATE | C_LEVEL | RN | CURRENT_RUNNING_DATE |
|----|-----------------------|-----------------------|---------|----|----------------------|
| 1 | 2017-01-01 00:00:00.0 | 2017-08-01 00:00:00.0 | 2 | 1 | 2017-08-01T00:00:00Z |
| 2 | 2016-01-01 00:00:00.0 | 2016-12-31 00:00:00.0 | 3 | 1 | 2017-08-01T00:00:00Z |
während für current_running_date = 2016-07-15
| ID | START_DATE | END_DATE | C_LEVEL | RN | CURRENT_RUNNING_DATE |
|----|-----------------------|-----------------------|---------|----|----------------------|
| 1 | 2016-01-01 00:00:00.0 | 2016-12-31 00:00:00.0 | 1 | 1 | 2016-07-15T00:00:00Z |
| 2 | 2016-01-01 00:00:00.0 | 2016-12-31 00:00:00.0 | 3 | 1 | 2016-07-15T00:00:00Z |
Was meinen Sie exaclty von "neuesten Daten"? Warum hat ID1 "neueste Daten", während ID 2 es nicht hat? – krokodilko
ID ist bis 2019 angemeldet, aber ID2 ist nicht mehr im System aktiv, er könnte ausgelaufen sein/wechselte zu einer anderen Versicherungsgesellschaft. –
ID 1 ist c_level "2" bis zum 8/1/2017 und ab dem 9/1/2017 wird er auf c_level "3" umgestellt, wenn ich die Abfrage ausführe sollte ich "8/1/2017" Zeilen bekommen und wenn ich Abfrage ausführen am 9/1/2017 Ich sollte 9/1/2017 erhalten –