SQL查找不同并显示其他列

时间:2013-07-09 04:14:17

标签: sql-server-2008

我已经阅读了很多回复和类似的问题,但似乎无法应用于我的情况。我有一张平均有10,000条记录的表,而且一直在变化。它包含一个名为deviceID的列,其中包含大约20个唯一值,另一个名为dateAndTime,还有许多其他值包括status1status2。我需要隔离每个deviceID的一个实例,显示具有最新dateAndTime的记录。这很好用:

select DISTINCT deviceID, MAX(dateAndTime)
from MyTable 
Group By deviceID 
ORDER BY MAX(dateAndTime) DESC 

(我注意到从上面的语句中省略 DISTINCT 也会产生相同的结果)

但是,我无法扩展此语句以包括字段状态字段,而不会在语句中引发错误或结果不正确。我尝试使用 IN EXISTS 和语法来隔离行,这些都没有运气。我想知道如何嵌套或重写此查询,以便结果显示唯一的deviceID,最新记录的日期以及与这些唯一记录关联的相应status字段。

2 个答案:

答案 0 :(得分:1)

如果您可以保证DeviceID + DateAndTime是UNIQUE,您可以执行以下操作:

SELECT * 
FROM 
    MyTable as T1, 
    (SELECT DeviceID, max(DateAndTime) as mx FROM MyTable group by DeviceID) as T2 
WHERE 
    T1.DeviceID  = T2.DeviceID AND 
    T1.DateAndTime = T2.mx

所以基本上会发生什么,你在DeviceID上做一个分组(注意:GROUP BY总是带有聚合函数。在这种情况下我们使用MAX)。 然后使用Table加入Query,并在WHERE子句中添加DeviceID + DateAndTime。

旁注... GROUP BY将返回不同的元素,有或没有添加DISTINCT,因为默认情况下所有行都是不同的。

答案 1 :(得分:0)

也许:

SELECT a.*
FROM( SELECT DISTINCT *,
      ROW_NUMBER() OVER (PARTITION BY deviceID ORDER BY dateAndTime DESC) as rown
      FROM MyTable ) a
WHERE a.rown = 1