2016-08-17 2 views
2

У меня есть следующий базовый оператор 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

что критерии для Shink вниз вашего результата? как вы решаете пропустить 85221, например? – techspider

+0

@techspider «Главное отличие в том, что я хочу только последнюю строку за минуту». –

+0

@MartinSmith да, получил смысл !! Вы тоже быстро отвечаете :) – techspider

ответ

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 
+0

Я верю 'ORDER BY Cycle_Id' в конце, а не' Cycle_Date' – techspider

+0

@techspider да может быть лучше. Это только вступит в игру, если две строки привязаны к максимуму с одинаковым временем до миллисекунды в 'Cycle_Date'. Я добавлю его в качестве ограничителя, поскольку в противном случае он может вернуть неправильную строку, если два столбца не будут строго синхронизироваться. –

+0

Я бы никогда не подумал сделать это таким образом. Спасибо за помощь! – Caimen

Смежные вопросы