2010-03-01 18 views
6

Se me ha pedido que busque una base de datos que registre el inicio de sesión y la actividad de cierre de sesión; hay una columna para iniciar sesión y otra para cerrar sesión, ambas en formato OLE. Necesito reunir información sobre la concurrencia del usuario, es decir, cuántos usuarios iniciaron sesión a la misma hora cada día.Número de filas 'superpuestas' en SQL Server

¿Alguien sabe cómo hacer esto en SQL? Realmente no necesito saber los detalles, solo el recuento por día.

Gracias de antemano.

Respuesta

1

Creo que esto funcionará

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

Gracias - Tuve que modificarlo ligeramente (agregando un GROUP BY al final de la selección interna), pero parece haber hecho el trabajo. – KenD

+0

Disculpa por eso, escribí esto en la parte superior de mi cabeza y no lo revisé lo suficiente. Agregué el grupo para responder. – JohnFx

2

La manera más fácil es hacer una times_table de una tabla de números auxiliar (mediante la adición de 0 a 24 * 60 minutos para el tiempo base) para obtener cada vez en un cierto periodo de 24 horas:

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

sin control ... pero pierden los valores de fecha, contar el tiempo entre, utilice "al final del día" por seguir conectado.

Esto supone "logintime" es una fecha y una hora. De lo contrario, la tabla derivada puede eliminarse (aunque aún se necesita ISNULL). por supuesto, SQL Server 2008 tiene "tiempo" para hacer esto más fácil también.

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 
Cuestiones relacionadas