如果我理解你的要求的權利,那麼這個查詢應該給你想要的東西:
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
;
演示:http://sqlfiddle.com/#!4/33de0/10
對於current_running_date = 2017-08-01
它給:
| 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 |
而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 |
你是什麼exaclty的 「最新數據」 是什麼意思?爲什麼ID1有「最新數據」,而ID 2沒有? – krokodilko
ID登記到2019年,但ID2不再在系統中激活,他可能會過期/切換到不同的保險公司。 –
ID 1註冊了c_level「2」直到2017年8月1日,從2017年9月1日開始,他被切換到c_level「3」,如果我執行查詢,我應該得到「8/1/2017」行,如果我執行查詢2017年9月1日我應該得到2017年9月1日 –