我有以下基本的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来摆脱秒和毫秒,但我应该从那里去哪里?
答案 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