чтобы найти кто залогинился первым в данный интервал времени sql - PullRequest
0 голосов
/ 22 декабря 2011

Это фиктивный скрипт:

create table #tempLogs (
UserId int identity(1,1) primary key,
LoggedAt DateTime not null
)
insert into #tempLogs values(getdate())
insert into #tempLogs values(getdate()-0.05)
insert into #tempLogs values(getdate()+0.0075)
select * from #tempLogs

SELECT top 1 UserId, (SUBSTRING((CONVERT(VARCHAR(20), LoggedAt)),13,5)) 
from #tempLogs
order by 2 


drop table #tempLogs

Как я могу оптимизировать:

SELECT top 1 UserId, (SUBSTRING((CONVERT(VARCHAR(20), LoggedAt)),13,5)) 
    from #tempLogs


where between @StartDate and @EndDate -- for some time interval. These are inputs  & need to be passed

order by 2 

Топ 1 на самом деле не является правильным решением, может быть более 1 пользователя, приходящего в одну минуту, то есть 9:27 9:27

Здесь используются только временные таблицы, фактически запрос будет выполняться по фактическим таблицам, а не по временным.

Нужен совет по оптимизации этого.

Пример:

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
4       2011-12-22 10:32:31.040

Output

2       2011-12-22 10:32:31.040
4       2011-12-22 10:32:31.040

Вот и все!

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Получить пользователя с минимальным значением LoggedAt можно так:

create table #tempLogs (
UserId int identity(1,1) primary key,
LoggedAt DateTime not null
)
insert into #tempLogs values(getdate())
insert into #tempLogs values(getdate()-0.05)
insert into #tempLogs values(getdate()+0.0075)


SELECT UserId, convert(varchar(5), LoggedAt, 108)
from #tempLogs
where LoggedAt = (select min(LoggedAt) from #tempLogs)




drop table #tempLogs
1 голос
/ 22 декабря 2011

Текущее наилучшее предположение при необходимом ответе:

Если вам нужно получить первое «с галстуками», то:

;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
...