1

我有一个 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 中报告多个状态。所有行都是通过插入创建的,因此随着新状态的进入,它们显然是机器的重复条目。无法预测任何列,所以我不能在任何部分进行任何 ='some hard coded string' 比较选择语句。


对于我提供的示例表,所需的结果如下所示:

类别 - 状态 - 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) 的组合,以及连接、分组依据、不同点和其他什么,但还没有找到一个可行的解决方案。

4

2 回答 2

3

如果您已经尝试过这种方法,但这种形式的分组和聚合应该可以工作

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

试试看,可能需要一些微调

于 2010-04-28T00:32:43.047 回答
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 的最后一行将 < 更改为 >]

于 2010-04-28T00:30:32.213 回答