2017-07-29 60 views
0

這是我的數據。會員可以多次註冊,並且可以隨時更改計劃,我需要獲取C_level數據以獲取近期最近發佈的「8/1/2017」的ID 1,因爲ID 2沒有最新數據,我們必須顯示12/31/2016記錄,希望這可以幫助。我知道任何問題,謝謝。如何獲得最新的有效記錄

ID Start_Date End_Date C_Level 
1 1/1/2016 12/31/2016 1 
1 1/1/2017 8/1/2017  2 
1 9/1/2017 12/31/2017 3 
1 1/1/2018 12/31/2018 0 
2 1/1/2015 12/31/2015 2 
2 1/1/2016 12/31/2016 3 
+0

你是什麼exaclty的 「最新數據」 是什麼意思?爲什麼ID1有「最新數據」,而ID 2沒有? – krokodilko

+0

ID登記到2019年,但ID2不再在系統中激活,他可能會過期/切換到不同的保險公司。 –

+0

ID 1註冊了c_level「2」直到2017年8月1日,從2017年9月1日開始,他被切換到c_level「3」,如果我執行查詢,我應該得到「8/1/2017」行,如果我執行查詢2017年9月1日我應該得到2017年9月1日 –

回答

1

如果我理解你的要求的權利,那麼這個查詢應該給你想要的東西:

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 | 
+0

哇,看起來不錯,我驗證所有情況下,請允許某個時候提供反饋意見,你真棒:) –