6

2 つのテーブルがあり、1 つはタスクのリストです。それらのタスクの履歴値を含むもう一方。

各チェックの最新のイベント (およびその説明) のリストを生成する必要がありますが、そのリストが現在の日時から(タスク内で使用するためにフォーマットされた、実行する必要がある時間) をDate_Executed引いたものよりも小さい限りは、 . ただし、.TimeframeTimeFrameDATEADDactive = 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

どちらも私が必要とするものを手に入れません。本当に助けが必要です。

4

1 に答える 1

8

あなたはSQL Serverと をサポートしているCommon Table ExpressionのでWindow Function。これを試して、

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 デモ

上記のクエリは、 をサポートする RDBMS でのみ機能しますWindow Functions。または、ほとんどの 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 デモ

于 2012-09-26T02:03:33.470 に答える