È possibile utilizzare l'opzione con operatore EXISTS
SELECT *
FROM dbo.tableName t
WHERE t.DateAndTime >= @YourDateCondition
AND EXISTS (
SELECT 1
FROM dbo.tableName t2
WHERE t2.Dateandtime >= DATEADD(HOUR, DATEDIFF(HOUR, 0, t.Dateandtime), 0)
AND t2.Dateandtime < DATEADD(HOUR, DATEDIFF(HOUR, 0, t.Dateandtime)+1, 0)
HAVING MAX(t2.Dateandtime) = t.Dateandtime
)
o l'opzione con CROSS APPLY operatore
SELECT *
FROM dbo.test83 t CROSS APPLY (
SELECT 1
FROM dbo.test83 t2
WHERE t2.Dateandtime >= DATEADD(HOUR, DATEDIFF(HOUR, 0, t.Dateandtime), 0)
AND t2.Dateandtime < DATEADD(HOUR, DATEDIFF(HOUR, 0, t.Dateandtime)+1, 0)
HAVING MAX(t2.Dateandtime) = t.Dateandtime
) o(IsMatch)
WHERE t.DateAndTime >= @YourDateCondition
Per migliorare le prestazioni utilizzare questo indice:
CREATE INDEX x ON dbo.test83(DateAndTime) INCLUDE(Value1, Value2)
fonte
2013-05-11 21:42:33
Mostraci cosa hai provato –
Definisci chiaramente "la parte superiore di ogni ora" - ad es. ''2013-05-11 09: 00: 00.000'' ma non'' 2013-05-11 09: 00: 01.000'' eccetera.Il livello di precisione che intendi aiuterà a determinare quali elementi temporali sono criteri validi. – J0e3gan