2017-02-13 6 views
2

Ich habe eine Tabelle, die wie folgt aussieht:SQL Anzahl der Unterschiede der spezifischen Zeitstempel

UNIQUEID FILEKEY DTTMSTAMP 
------------------------------------------- 
282   1  2012-07-19 09:02:00.000 
283   1  2012-07-19 17:12:00.000 
284   1  2012-07-20 08:53:00.000 
285   1  2012-07-20 17:09:00.000 
286   1  2012-07-23 08:54:00.000 
287   1  2012-07-23 17:06:00.000 
288   1  2012-07-24 09:00:00.000 
289   1  2012-07-24 17:04:00.000 
290   1  2012-07-25 08:59:00.000 
291   1  2012-07-25 17:05:00.000 

Es gibt weit über 50K Reihen. Ich brauche die folgenden Informationen aus dieser erhalten:

Ich brauche die Zählung der Anzahl Tage, wo es genau 4 Zeitstempel für ein gegebenes filekey und die Differenz zwischen den vierten dttmstamp und den dritten dttmstamp größer als 3 Stunden.

Es sollte schließlich wie folgt aussehen:

Filekey Count 
---------------- 
1   650 

usw.

+0

'genau 4 timestamps' tun Sie am selben Tag bedeuten? – McNets

+0

Was ist die Version von SQL Server? – gofr1

+0

Dies macht keinen Sinn, bitte umformuliere und/oder füge die realistisch gewünschte Ausgabe hinzu. – dean

Antwort

1

In SQL Server 2012 Sie LAG verwenden können:

;WITH cte AS (
    SELECT FILEKEY, 
      DTTMSTAMP, 
      ROW_NUMBER() OVER (PARTITION BY FILEKEY, CAST(DTTMSTAMP as date) ORDER BY DTTMSTAMP) as RN, 
      DATEDIFF(second,LAG(DTTMSTAMP,1,NULL) OVER (ORDER BY DTTMSTAMP),DTTMSTAMP)/3600 as SEQ 
    FROM YourTable 
) 

SELECT FILEKEY, 
     COUNT(DTTMSTAMP) as [COUNT] 
FROM cte 
WHERE RN = 4 and SEQ >= 3 
GROUP BY FILEKEY 
HAVING MAX(RN) = 4 

Für SQL Server < 2012 sollte dies in cte Teil arbeiten:

SELECT t.FILEKEY, 
     t.DTTMSTAMP, 
     ROW_NUMBER() OVER (PARTITION BY t.FILEKEY, CAST(t.DTTMSTAMP as date) ORDER BY t.DTTMSTAMP) as RN, 
     DATEDIFF(second,DTTMSTAMP_PREV,DTTMSTAMP)/3600 as SEQ 
FROM YourTable t 
OUTER APPLY (
    SELECT TOP 1 DTTMSTAMP as DTTMSTAMP_PREV 
    FROM YourTable 
    WHERE FILEKEY = t.FILEKEY AND DTTMSTAMP < t.DTTMSTAMP 
    ORDER BY DTTMSTAMP DESC 
    ) as d 
+1

Ganz in der Nähe, aber Sie müssen auch MAX (RN) = 4 – Hogan

+0

@Hogan testen Danke! schöner Fang! Ich füge das meiner Antwort hinzu. – gofr1

+0

Wow ... gerade herausgefunden, dass dies SQL Server 2000 ist. – Green

0

SQL Server 2012 an:

with CTE as 
(
select FILEKEY, 
     convert(date, DTTMSTAMP) as DTSTAMP, 
     DTTMSTAMP, 
     datediff(hh, DTTMSTAMP, lead(DTTMSTAMP) over(partition by FileKey order by DTTMSTAMP)) as Dif, 
     row_number() over(partition by FILEKEY order by DTTMSTAMP) as R_ORD 
from MyTable 
) 

select FileKey, count(distinct DTSTAMP) 
from CTE 
where exists (select 1 from CTE a where a.Filekey = Filekey and Dif >= 3 and R_Ord = 3) 
group by FileKey 
having max(R_Ord) = 4 
Verwandte Themen