2010-03-01 2 views
6

Мне было предложено посмотреть базу данных, которая регистрирует активность входа пользователя и выхода из системы - есть столбец для времени входа в систему, а затем еще один столбец для записи выхода из системы, как в формате OLE. Мне нужно собрать некоторую информацию о параллелизме пользователей - то есть сколько пользователей было зарегистрировано в одно и то же время каждый день.Подсчитайте количество строк с перекрытием в SQL Server

Кто-нибудь знает, как это сделать в SQL? Мне не нужно знать подробности, просто количество в день.

Заранее спасибо.

ответ

1

Я думаю, это сработает.

Select C.Day, Max(C.Concurrency) as MostConcurrentUsersByDay 
FROM 
(
    SELECT convert(varchar(10),L1.StartTime,101) as day, count(*) as Concurrency 
    FROM login_table L1 
    INNER JOIN login_table L2 
     ON (L2.StartTime>=L1.StartTime AND L2.StartTime<=L1.EndTime) OR 
     (L2.EndTime>=L1.StartTime AND L2.EndTime<=L1.EndTime) 
    WHERE (L1.EndTime is not null) and L2.EndTime Is not null) AND (L1.ID<>L2.ID) 
    GROUP BY convert(varchar(10),L1.StartTime,101) 
) as C  
Group BY C.Day 
+0

Спасибо - мне пришлось слегка его подстроить (добавив GROUP BY до конца внутреннего выбора), но, похоже, он выполнил эту работу. – KenD

+0

Извините, что написал это с верхней части головы и не проверял достаточно внимательно. Я добавил группу, чтобы ответить. – JohnFx

2

Самый простой способ сделать times_table от вспомогательного чисел таблицы (путем добавления от 0 до 24 * 60 минут к базовому времени), чтобы получить каждый раз, когда в определенном 24-часовой период:

SELECT MAX(simul) FROM (
    SELECT test_time 
     ,COUNT(*) AS simul 
    FROM your_login_table 
    INNER JOIN times_table -- a table/view/subquery of all times during the day 
     ON your_login_table.login_time <= times_table.test_time AND times_table.test_time <= your_login_table.logout_time 
    GROUP BY test_time 
) AS simul_users (test_time, simul) 
1

Неконтролируемый ... но теряют значения даты, отсчет времени между ними, использовать «конец дня» по-прежнему вошли.

Это предполагает «logintime» является дата и время. Если нет, производная таблица может быть удалена (все-таки нужен ISNULL). конечно, SQL Server 2008 имеет «время», чтобы сделать это проще.

SELECT 
    COUNT(*) 
FROM 
    (
    SELECT 
     DATEADD(day, DATEDIFF(day, logintime, 0), logintime) AS inTimeOnly, 
     ISNULL(DATEADD(day, DATEDIFF(day, logouttime, 0), logintime), '1900-01-01 23:59:59.997') AS outTimeOnly 
    FROM 
     mytable 
    ) foo 
WHERE 
    inTimeOnly >= @TheTimeOnly AND outTimeOnly <= @TheTimeOnly 
Смежные вопросы