如何才能找到最新的日期时间行?

时间:2016-08-17 18:32:34

标签: sql sql-server

我有以下基本的SQL语句。

SELECT 
    [Cycle_Id], [Machine], [Machine_Action], [Cycle_Date]
FROM 
    [EKAM].[dbo].[Machine_Cycle]
WHERE 
    Machine = 'OKK 2' 
    AND Cycle_Date BETWEEN '2016-08-15 7:59:00' AND '2016-08-18 7:59:00'
ORDER BY 
    Cycle_Date DESC

返回以下数据。

Cycle_Id   Machine   Machine_Action    Cycle_Date
--------------------------------------------------------------
85220      OKK 2     UP                2016-08-15 09:07:39.883
85221      OKK 2     DOWN              2016-08-15 09:08:04.367
85223      OKK 2     UP                2016-08-15 09:08:44.367
85226      OKK 2     DOWN              2016-08-15 09:08:55.367
85233      OKK 2     UP                2016-08-15 09:09:38.367
85234      OKK 2     DOWN              2016-08-15 09:10:07.367

但我需要它来取代以下数据。主要的区别是我只想要每分钟最新一行。

85220   OKK 2   UP      2016-08-15 09:07:39.883
85226   OKK 2   DOWN    2016-08-15 09:08:55.367
85233   OKK 2   UP      2016-08-15 09:09:38.367
85234   OKK 2   DOWN    2016-08-15 09:10:07.367

我有太多的数据,我并不担心数据像毫秒和秒一样精细。我每分钟只需要一排,但由于某种原因,我无法绕过它。也许我昨​​晚睡不着觉。

我觉得我需要重新设计Cycle_Date来摆脱秒和毫秒,但我应该从那里去哪里?

1 个答案:

答案 0 :(得分:2)

你不应该在这里使用BETWEEN,因为这将排除几乎所有可能不是你想要的最后一分钟。

要保留每分钟的最新行数,您可以使用

WITH T AS
(
SELECT 
   Cycle_Id
  ,[Machine]
  ,[Machine_Action]
  ,[Cycle_Date]
  ,ROW_NUMBER() OVER (PARTITION BY DATEDIFF(Minute, 0, CycleDate) 
                      ORDER BY CycleDate DESC, Cycle_Id DESC) AS RN
FROM [EKAM].[dbo].[Machine_Cycle]
WHERE Machine = 'OKK 2' AND 
Cycle_Date >= '2016-08-15 7:59:00' AND Cycle_Date < '2016-08-18 8:00:00'
)
SELECT 
   Cycle_Id
  ,[Machine]
  ,[Machine_Action]
  ,[Cycle_Date]
FROM T
WHERE RN = 1
ORDER BY Cycle_Date DESC