2

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

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

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

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

4

2 回答 2

1

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

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)。然后将查询与表连接起来,并在 WHERE 子句中添加 DeviceID + DateAndTime。

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

于 2013-07-09T06:40:11.223 回答
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
于 2013-07-09T06:15:49.037 回答