2012-03-08 132 views
0

我想在不運行內部查詢的情況下關閉此查詢,但似乎無法正確獲取記錄。用最新的日誌選擇記錄

我有兩個表(命名約定改變了可讀性)...

report 
    report_id 
    name 

report_status_log 
    report_id 
    code 
    timestamp 

一個報表可以有幾種狀態日誌。我試圖獲取最新report_status_log等於某個特定代碼的所有報告。

這樣可不行......

select report.id 
     inner join report_status_log on report.report_id = report_status_log.report_id 
where report_status_log.code = 'finished' 

...因爲雖然「完成」可能會在狀態日誌,它不一定永遠是最新的日誌記錄。

有沒有辦法做到這一點?還是應該從report_status_log表中選擇而不是報表?

回答

2
with cte as (
    select *, 
    row_number() over (partition by report_id order by timestamp desc) as RowNum 
    from report_status_log 
) 

select * 
from report r 
inner join cte c 
on r.report_id = c.report_id 
where c.code = 'finished' and RowNum = 1 
2

難道你不能只使用時間戳上的最大值函數來獲取最近的日誌嗎?

select report_id 
from report 
inner join report_status_log on report.report_id = report_status_log.report_id 
where timestamp = (SELECT MAX(timestamp) FROM report_status_log) 
and report_status_log.code = 'finished' 
+1

是的,這個問題在StackOverflow上非常常見。這是今天的第二個。當然,這是最合乎邏輯和直接的方法。 – 2012-03-08 21:50:20

+0

這工作,但只會得到一個記錄,而不是100%確定爲什麼 – jyoseph 2012-03-09 16:38:25