我有一个带有列的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),以及连接,分组,区别和什么不是,但还没有找到可行的解决方案。
答案 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的最后一行