SQL 服务器 : max date and inner join

标签 sql database windows sql-server-2008 tsql

我有两个表,一个是任务列表。另一个包含这些任务的历史值(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 ExpressionWindow 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/

相关文章:

sql - ORA-00604 : error occurred at recursive SQL level 1

php - 是否可以将查询数量从 5 个减少到 1 个?

sql - 在 POSTGRESQL 中更新主键

php - 从 Mysql DB 回显 php 变量

mysql - SQL查询以正确的顺序显示2列

mysql - 尽管加入,但列出所有行

sql - table==1 是意外的此时批处理文件

Python os.listDir 在某些文件夹上抛出 "WindowsError: [Error 5] Access is denied:"

c++ - 如何识别 QWidget 上的点击类型

windows - netsh winsock reset - 它的作用是什么?为什么我的无线网卡在使用该命令之前没有建立良好的连接?