我已经阅读了很多回复和类似的问题,但似乎无法应用于我的情况。我有一张平均有10,000条记录的表,而且一直在变化。它包含一个名为deviceID
的列,其中包含大约20个唯一值,另一个名为dateAndTime
,还有许多其他值包括status1
和status2
。我需要隔离每个deviceID的一个实例,显示具有最新dateAndTime的记录。这很好用:
select DISTINCT deviceID, MAX(dateAndTime)
from MyTable
Group By deviceID
ORDER BY MAX(dateAndTime) DESC
(我注意到从上面的语句中省略 DISTINCT 也会产生相同的结果)
但是,我无法扩展此语句以包括字段状态字段,而不会在语句中引发错误或结果不正确。我尝试使用 IN 和 EXISTS 和语法来隔离行,这些都没有运气。我想知道如何嵌套或重写此查询,以便结果显示唯一的deviceID,最新记录的日期以及与这些唯一记录关联的相应status
字段。
答案 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