选择对象上可用链接的每个类别的最新记录

时间:2010-04-28 00:20:54

标签: sql sql-server sql-server-2008 select greatest-n-per-group

我有一个带有列的tblMachineReports:Status(varchar),LogDate(datetime),Category(varchar)和MachineID(int)。

我想从每个机器的每个类别中检索最新的状态更新,因此实际上获取了其MachineID所特有的所有机器的最新状态的快照。

表数据看起来像是

类别 - 状态 - MachineID - LogDate
cata - status1 - 001 - date1
cata - status2 - 002 - date2
catb - status3 - 001 - date2
catc - status2 - 002 - date4
cata - status3 - 001 - date5
catc - status1 - 001 - date6
catb - status2 - 001 - date7
cata - status2 - 002 - date8
catb - status2 - 002 - date9
catc - status2 - 001 - date10


重申,我有多台机器报告此tblMachineReports中的多个状态。所有行都是通过插入创建的,因此当新状态进入时,它们显然是机器的重复条目。没有列可以预测,所以我不能做任何='某些硬编码字符串'的任何部分比较选择陈述。


对于我提供的样本表,所需的结果如下:

类别 - 状态 - MachineID - LogDate
catc - status2 - 002 - date4
cata - status3 - 001 - date5
catb - status2 - 001 - date7
cata - status2 - 002 - date8
catb - status2 - 002 - date9
catc - status2 - 001 - date10

使用MS SQL Server 2008,select语句在实现这一目标时会是什么样的,获得每台机器上每个类别的最新状态?我已经尝试了不同的子查询组合以及聚合MAX(LogDates),以及连接,分组,区别和什么不是,但还没有找到可行的解决方案。

2 个答案:

答案 0 :(得分:3)

如果你已经尝试过这种方法,那么这种形式的分组和聚合应该可行

select *
from tblMachineReports t
where LogDate = (select max(LogDate) from tblMachineReports t2 where t.machineID = t2.machineID and t.category = t2.category)

尝试一下,可能需要一些微调

答案 1 :(得分:2)

 SELECT * FROM tblMachineReports MR1 
    WHERE NOT EXISTS
       (SELECT * FROM tblMachineReports MR2 WHERE
            MR2.Category = MR1.Category AND 
            MR2.MachineID = MR1.MachineID AND
            MR2.LogDate > MR1.LogDate)

唯一的问题是,如果你有相同的类别&在同一天多次使用机器,您将获得该日期的所有记录,而不仅仅是最后一个。要解决此问题,请将LogDate更改为DATETIME,如果您有权访问数据库结构或向表中添加数字增加的标识列,并在SELECT语句中使用它而不是LogDate。

[编辑改变<到>在SQL的最后一行