我有两个表,一个是任务列表。另一个包含这些任务的历史值(value)。
我需要为每个检查生成最新事件(及其描述)的列表,只要它的 Date_Executed
小于当前日期时间减去 Timeframe
(TimeFrame
是必须完成任务的小时数,格式为在 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
这两个都不能满足我的需要,我真的需要一些帮助。
最佳答案
因为你是 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 Demo
以上查询仅适用于支持Window Functions
的RDBMS。或者,使用下面适用于大多数 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
关于SQL 服务器 : max date and inner join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12593492/