Текущее наилучшее предположение при необходимом ответе:
Если вам нужно получить первое «с галстуками», то:
;WITH RankedLogs as (
SELECT ID,LoggedAt,RANK() OVER (ORDER BY LoggedAt) as rn
from #tempLogs where LoggedAt between @StartDate and @EndDate
)
SELECT * from RankedLogs where rn = 1
Или, если два логина в течение одной минуты должны ранжироваться вместе, тогда:
;WITH RankedLogs as (
SELECT ID,LoggedAt,RANK() OVER (ORDER BY DATEADD(minute,DATEDIFF(minute,0,LoggedAt),0)) as rn
from #tempLogs where LoggedAt between @StartDate and @EndDate
)
SELECT * from RankedLogs where rn = 1
Предыдущие ответы:
Полностью случайное предположение - вы хотите найти самый ранний логин в течение каждого часового интервала. Предполагается, что сценарий установки соответствует вашему вопросу:
;With RankedLogins as (
Select UserID,LoggedAt,ROW_NUMBER() OVER (PARTITION BY DATEADD(hour,DATEDIFF(hour,0,LoggedAt),0) ORDER BY LoggedAt) as rn
from #tempLogs
)
select * from RankedLogins where rn = 1
Результат от настройки таблицы:
UserId LoggedAt
1 2011-12-22 11:44:31.037
2 2011-12-22 10:32:31.040
3 2011-12-22 11:55:19.040
И результаты:
UserID LoggedAt rn
2 2011-12-22 10:32:31.040 1
1 2011-12-22 11:44:31.037 1
Чтобы узнать, кто входил первым каждый день, измените два экземпляра hour
в приведенном выше запросе на day
.
Для вашего более простого вопроса (в основном, найдите самую раннюю строку между @StartDate
и @EndDate
), это может быть просто:
SELECT top 1 * from #tempLogs
where LoggedAt between @StartDate and @EndDate
order by LoggedAt