2016-07-08 22 views
0

Ich bin auf der Suche nach der Anzahl der Benutzer, die zu einem bestimmten Zeitpunkt an einem Server angemeldet sind. Ich habe Daten auf Benutzerebene mit der Anfangsdatumszeit und Enddatumszeit.Microsoft SQL Server - Joining basierend auf Start DateTime und EndDateTime mit einer kumulativen Summe

Tabelle 1

user_ID   start_time   end_time 
---------------------------------------------------------- 
1XbC34   03/06/2016 00:00:06 03/06/2016 00:23:26 
2re56   03/06/2016 00:01:07 03/06/2016 00:32:40 
sdf4ser1w  03/06/2016 00:02:10 03/06/2016 00:02:37 
sf54fw3fa  03/06/2016 00:02:11 03/06/2016 00:25:42 
fa31f1asf1  03/06/2016 00:04:17 03/06/2016 00:05:43 
gvf5af13a  03/06/2016 00:04:18 03/06/2016 00:05:30 
f2s14fs3afd1a 03/06/2016 00:04:33 03/06/2016 00:05:07 
sdf1a3f1d3sa 03/06/2016 00:04:34 03/06/2016 00:23:02 

Der Ausgang Ich sehe bin für ist

DateTime    Logged in accumulative (between Start and end) 
-------------------------------------------- 
03/06/2016 00:00:06, 1 
03/06/2016 00:01:07, 2 
03/06/2016 00:02:10, 3 
03/06/2016 00:02:11, 4 
03/06/2016 00:04:17, 4 

etc ...

Meine ersten Überlegungen eine temporäre Tabelle zu erstellen waren, die alle halten würde das Datum/die Uhrzeit für den Beitritt zu Tabelle 1, wie unten gezeigt.

select dt.Start_time 
into #cal 
from table1 dt 
where dt.start_time between '2016-06-03 00:00:00' AND '2016-06-03 23:59:59' 
group by dt.start_time 

Die nächste wäre die Verknüpfung zu erstellen.

Select dt.Start_Time, count(*) 
from table1 dt 
left Join #cal C on C.start_time between dt.start_time AND dt.end_time 
where dt.start_time between '2016-06-03 00:00:00' AND '2016-06-03 23:59:59' 
group by dt.start_time 

Jede Hilfe sehr geschätzt.

Danke,

Mark

+0

ich davon ausgegangen, dass * * von "Microsoft SQL" Sie wirklich bedeuten "Microsoft SQL Server ** **" und fügte hinzu, das entsprechende Etikett für diese (Es könnte * auch * bedeuten, SQL in Microsoft Access - aber das scheint nicht wahrscheinlich). Bitte ** immer ** einen relevanten, nützlichen Tag für Ihr tatsächlich verwendetes RDBMS zur Verfügung stellen - 'sql' ist nur die Abfragesprache, die von vielen vielen Datenbanken verwendet wird und ist daher nicht wirklich sehr hilfreich ... –

Antwort

1

Sie können dies tun, indem Sie eine abgeleitete Tabelle mit dem Start- und Endzeiten auf verschiedenen Zeilen und einem Flag, das angibt beginnen oder enden zu schaffen. Dann gibt eine kumulative Summe dieses Flags die gewünschten Informationen.

In SQL Server 2012+, das sieht aus wie:

select t1.t, sum(inc) over (order by t) as num_users 
from ((select start_time as t, 1 as inc from table1) union all 
     (select end_time, -1 as inc from table1) 
    ) t1;