2009-10-11 8 views
0

J'ai une base de données SQL 2005 remplie d'enregistrements d'activité qui incluent une colonne DateTime, un DeviceID et divers bits de données. J'ai besoin d'une requête qui me donnera une liste de plages de date/heure basées sur DeviceID (éventuellement limitée par une heure de début/fin). De plus, je considérerais une nouvelle gamme comme commençant au moins 60 minutes après la fin de l'ancienne (si elle est inférieure à 60 minutes, alors cela fait partie de l'ancienne gamme).Obtient un ensemble de plages de dates/heures basées sur des données de base de données

Exemple de données:

 
DateTime     DeviceID 
2009-10-11 12:01:30  Dev1 
2009-10-11 12:02:30  Dev1 
2009-10-11 12:03:21  Dev1 
2009-10-11 12:04:30  Dev1 
2009-10-11 12:05:45  Dev1 
2009-10-11 12:06:10  Dev1 
2009-10-11 12:07:40  Dev1 
2009-10-11 12:08:20  Dev1 
2009-10-11 13:30:11  Dev1 
2009-10-11 13:32:21  Dev1 
2009-10-11 13:36:45  Dev1 
2009-10-11 13:39:16  Dev1 
2009-10-11 13:42:18  Dev1 
2009-10-11 13:46:22  Dev1 
2009-10-11 13:48:35  Dev1 

Résultats attendus:

 
StartDate    EndDate 
2009-10-11 12:01:30  2009-10-11 12:08:20 
2009-10-11 13:30:11  2009-10-11 13:48:35 

Répondre

0

lu quelque chose sur ROW_NUMBER()

Ensuite, regardez cette requête:

SELECT <br> 
&nbsp;&nbsp; DeviceID,<br> 
&nbsp;&nbsp; "DateTime",<br> 
&nbsp;&nbsp; ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br> 
FROM TableName 

Then look at this query: 

WITH DateTable <br> 
AS<br> 
(SELECT <br> 
&nbsp;&nbsp; DeviceID,<br> 
&nbsp;&nbsp; "DateTime",<br> 
&nbsp;&nbsp; ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br> 
FROM TableName)<br> 
SELECT <br> 
&nbsp;&nbsp; D1.DeviceID,<br> 
&nbsp;&nbsp; D1."DateTime" EndDate,<br> 
&nbsp;&nbsp; D2."DateTime" StartDate<br> 
FROM DateTable D1<br> 
JOIN DateTable D2<br> 
ON (D1.DeviceID = D2.DeviceID) <br> 
&nbsp;&nbsp; AND (D1.OrdinalNumber = D2.OrdinalNumber - 1) <br> 
&nbsp;&nbsp; AND (DATEDIFF(MINUTE,D1."DateTime",D2."DateTime") >= 60)<br> 

Nous sommes à la recherche d'écarts avec plus de 60 minutes de différence.

Maintenant, vous devez prendre StartDate de chaque ligne et le faire correspondre avec EndDate à partir de suivant. Comme il est 4 heures du matin, je vais vous le laisser :)

Questions connexes