Для ясности, я бы, вероятно, использовать два этапа, КТР на основе подхода (это работает в SQL Server и новее - вы не четко указать, какие версии в SQL Server, который вы используете, так что я просто надеюсь, что ты не на древней версии как 2000 больше):
-- define a "base" CTE to get the hour component of your "DateAndTime"
-- column and make it accessible under its own name
;WITH BaseCTE AS
(
SELECT
ID, DateAndTime,
Value1, Value2,
HourPart = DATEPART(HOUR, DateAndTime)
FROM dbo.YourTable
WHERE DateAndTime >= @SomeThresholdDateHere
),
-- define a second CTE which "partitions" the data by this "HourPart",
-- and number all rows for each partition starting at 1. So each "last"
-- event for each hour is the one with the RN = 1 value
HourlyCTE AS
(
SELECT ID, DateAndTime, Value1, Value2,
RN = ROW_NUMBER() OVER(PARTITION BY HourPart ORDER BY DateAndTime DESC)
FROM BaseCTE
)
SELECT *
FROM HourlyCTE
WHERE RN=1
Также: я не был уверен, что именно точно Вы имеете в виду под «вершиной часа» - строкой, которая была создана в начале каждого часа (например, на 04:00:00
) - вернее, последний ряд, созданный в промежуток времени этого часа? Если вы имеете в виду первый за каждый час - то вам нужно изменить ORDER BY DateAndTime DESC
к ORDER BY DateAndTime ASC
Покажите нам, что вы попробовали –
Определите "верхний час каждого часа" очень четко - например. '' 2013-05-11 09: 00: 00.000'', но не '' 2013-05-11 09: 00: 01.000'' и т. Д.Уровень точности, который вы намереваетесь, поможет определить, какие временные элементы являются действительными критериями. – J0e3gan