2012-03-08 11 views
0

内部クエリを実行せずにこのクエリを実行しようとしていますが、レコードを正しく取得できないようです。最新のログを含むレコードを選択

私は2つのテーブル(命名規則は、読みやすくするために変更された)...

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

最新のログを取得するためにタイムスタンプでmax機能を使用することはできませんか?

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でよく起こります。これは今日の2番目のものです。確かに、これは最も論理的で直接的な方法です。 –

+0

これはうまくいっていますが、単一のレコードしか得られないでしょう。なぜ100%ではないのでしょうか? – jyoseph

関連する問題