2012-09-26 11 views
6

私は2つのテーブルを持っています、1つはタスクのリストです。もう1つはこれらのタスクの履歴値を含んでいます。SQL Server:最大日付と内部結合

は私が仕事を行う必要があります以内に限り長くそのDate_Executedは、現在の日時マイナスTimeframeTimeFrameいる時間未満であると、各チェックの最新イベントのリスト(およびその説明)を生成する必要があります、DATEADDで使用するようにフォーマットされています)。ただし、active = 1がある場合に限ります。

表:チェック

Check_id description TimeFrame active 
1   Task One  -24  0 
2   Task Two  -24  0 
3   Task Forty -48  1 
4   Task Somehin -128  1 

表:イベント

Event_id Check_id Comment  Date_Executed    User_Executed 
1   1   NULL  2012-09-18 16:10:44.917 admin 
2   1   NULL  2012-09-25 11:39:01.000 jeff 
3   4   Failed  2012-09-25 13:20:09.930 steve 
4   4   Half failed 2012-09-25 13:05:09.953 marsha 
5   2   NULL  2012-09-25 14:02:24.000 marsha 
6   3   NULL  2012-09-18 16:10:55.023 marsha 

私がこれまで持っている最高のソリューションは、次のとおりです。

SELECT 
    a.[Date_Executed] 
    a.[Check_id], 
    a.[Comments], 
    b.[frequency], 
    b.[Check_id], 
    b.[description]  
FROM 
    [checksdb].[dbo].events as a, 
    [checksdb].[dbo].checks as b 
where 
    b.active = 1 
    and a.[Date_Executed] < = dateadd(HOUR,b.[frequency],GETDATE()) 
    and a.Check_id = b.Check_id 
order by Check_id, priority 

select MAX(date_Executed), Task_id from daily_check_events group by Task_id 

どちらも私に必要なものが得られないので、私は実際にいくつかの助けを使うことができます。

+3

に取り組んでいますでしょうか?また、[FROM table_a、table_b'構文の使用を中止してください](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx)。 –

答えて

8

あなたはとWindow FunctionをサポートするSQL Serverです。上記のクエリだけWindow FunctionsをサポートしてRDBMS上で動作します

WITH latestEvents 
AS 
(
    SELECT Event_id, Check_id, [Comment], Date_Executed, User_Executed, 
      ROW_NUMBER() OVER(PARTITION BY Check_ID ORDER BY DATE_Executed DESC) 
       AS RowNum 
    FROM events 
) 
SELECT a.[Check_id], a.[description], 
     b.[Date_Executed], b.[Comment] 
FROM checks a 
     INNER JOIN latestEvents b 
      on a.check_ID = b.check_ID 
WHERE b.RowNum = 1 AND 
     a.active = 1 
     -- other conditions here 

SQLFiddle Demo

、これを試してみてください。また、あなたが望む結果を示すことができ、その下のクエリは、ほとんどのRDBMS

あなたはあなたが望む結果が得られていないことを試みたクエリに加えて
SELECT a.Check_id, a.description, 
     c.Date_Executed, c.Comment 
FROM checks a 
     INNER JOIN 
     (
      SELECT check_id, MAX(Date_Executed) maxExecuted 
      FROM events 
      GROUP BY check_ID 
     ) b ON a.check_ID = b.check_ID 
     INNER JOIN events c 
      ON c.check_ID = b.check_ID AND 
      c.date_executed = b.maxExecuted 
WHERE a.active = 1 

SQLFiddle Demo

+0

ありがとう。私は 'Common Table Expression'バージョンを使用して終了しました。(遅く返事を申し訳ありません、徹底的にテストしなければなりませんでした。) – flammable

関連する問題