2017-02-13 14 views
2

У меня есть таблица, которая выглядит следующим образом:SQL подсчет различий определенных временных меток

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 

Есть также более 50K строк. Мне нужно, чтобы получить следующую информацию из этого:

Мне нужен подсчет количества дней, где есть ровно 4 временные метки для данного filekey и разница между четвертым dttmstamp и 3 dttmstamp больше, чем на 3 часа.

Это в конечном итоге должно выглядеть следующим образом:

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

т.д.

+0

'ровно 4 timestamps' вы имеете в виду тот же день? – McNets

+0

Что такое версия SQL Server? – gofr1

+0

Это не имеет смысла, перефразируйте PLS и/или добавьте реалистичный желаемый результат. – dean

ответ

1

В SQL Server 2012 можно использовать LAG:

;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 

Для SQL Server 2012 < это должно работать в cte части:

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

Очень близко, но вам также нужно проверить MAX (RN) = 4 – Hogan

+0

@Hogan спасибо! Хорошо поймал! Я добавляю это к своему ответу. – gofr1

+0

Wow ... только что узнал, что это SQL Server 2000. – Green

0

SQL Server 2012 года:

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