2015-09-01 48 views
1

我正試圖將最新記錄返回給數據庫中的每個recordId。 我有一個存儲通知的表,每個通知都有自己的ID,但它們與一個personId相關聯。 但是,此人員ID可以有多個通知。我想要做的是隻檢索通知表上每個personId的最後通知。如何將最新記錄返回給SQL中的每個人員ID

舉例來說,我可以有很多personIds,每個PERSONID可以有很多通知,但每個PERSONID應該返回剛剛過去的通知創建(PS我保存每個新的通知時間戳)

我來什麼事這麼遠遠是:

SELECT * 
    FROM Notification 
    WHERE notificationEndDate <= '20151101' 
    AND 
    person_id IN 
    (
    SELECT MAX(notificationEndDate) 
    FROM Notification 
    ) 

查詢運行,但看起來像我失去了它的某個地方。 任何人都可以建議我該如何實現它嗎?

+0

歡迎來到SO。請顯示樣品表數據和預期的輸出。 – OldProgrammer

+0

您正在使用哪些DBMS? –

+0

除了OldProgrammer的評論,我還想知道你使用的是哪個數據庫?這可能會影響SQL,因爲差異數據庫具有不同的語法和命令。 –

回答

2

返回一行,如果不存在後一行同一PERSONID。

SELECT * 
FROM TPER_VISA t1 
WHERE per_visa_ed <= '20151101' 
AND NOT EXISTS (select 1 from TPER_VISA t2 
       where t2.personId = t1.personId 
        and t2.per_visa_ed <= '20151101' 
        and t2.per_visa_ed > t1.per_visa_ed) 
ORDER BY per_visa_ed 
+0

謝謝你的工作。你的邏輯很聰明。 –

0

試試這個

WITH CTE1 AS(
SELECT *, ROW_NUMBER() OVER(PARTITION BY person_id ORDER BY per_visa_ed 
DESC) AS Row_COUNT 
FROM TPER_VISA 
) 
SELECT * FROM CTE1 WHERE Row_COUNT = 1 
+0

感謝您的回覆,但它仍然會將所有通知返回給某個人。我將編輯帖子以便更清楚。謝謝 –

+0

@WilFerraciolli,我更新了ans ..看看。 –