2017-03-19 1 views
-3

이 쿼리는 1 시간 내에 1에서 20까지의 이벤트 값을 제공하고, 연속 이벤트 값이> = 200 인 경우에도이를 추가하는 방법은 무엇입니까? 이 더미 24 표에서 다음 행 값에 대한 SQL Server 쿼리 이전 행 값

SELECT ID, count(Event) as numberoftimes 
FROM table_name 
WHERE Event >=1 and Event <=20 
GROUP BY ID, DATEPART(HH, AtHour) 
HAVING DATEPART(HH, AtHour) <= 1 
ORDER BY ID desc 

:

+----+-------+--------+ 
| ID | Event | AtHour | 
+----+-------+--------+ 
| 1 |  1 | 11:00 | 
| 1 |  4 | 11:01 | 
| 1 |  1 | 11:02 | 
| 1 | 20 | 11:03 | 
| 1 | 200 | 11:04 | 
| 1 |  1 | 13:00 | 
| 1 |  1 | 13:05 | 
| 1 |  2 | 13:06 | 
| 1 | 500 | 13:07 | 
| 1 | 39 | 13:10 | 
| 1 | 50 | 13:11 | 
| 1 |  2 | 13:12 | 
+----+-------+--------+ 

I 한시간 내에 200보다 크거나 같은 값 바로 다음에 1 내지 20 범위의 값으로 이벤트와 ID를 선택하고 싶다. 대신하는 시간의 고유 한 ID 일어난 횟수

+----+--------+ 
| ID | AtHour | 
+----+--------+ 
| 1 |  11 | 
| 1 |  13 | 
| 2 |  11 | 
| 2 |  14 | 
| 3 |  09 | 
| 3 |  12 | 
+----+--------+ 

하거나 :

예상 결과는 같을 것이다. 실례합니다. 포스트 서식으로 녹슨 것 같습니다.

+0

예제 테이블을 확인하십시오. 틀린 것 같습니다. –

+0

지금까지 시도한 것은 무엇입니까? 현재 코드를 보여주십시오. –

+0

질문에 넣을 수 있습니다. –

답변

0
CREATE TABLE data (Id INT, Event INT, AtHour SMALLDATETIME); 

INSERT data (Id, Event, AtHour) VALUES 
(1,1,'2017-03-16 11:00:00'), 
(1,4,'2017-03-16 11:01:00'), 
(1,1,'2017-03-16 11:02:00'), 
(1,20,'2017-03-16 11:03:00'), 
(1,200,'2017-03-16 11:04:00'), 
(1,1,'2017-03-16 13:00:00'), 
(1,1,'2017-03-16 13:05:00'), 
(1,2,'2017-03-16 13:06:00'), 
(1,500,'2017-03-16 13:07:00'), 
(1,39,'2017-03-16 13:10:00') 
; 

; WITH temp as (
    SELECT rownum = ROW_NUMBER() OVER (PARTITION BY id ORDER BY AtHour) 
    , * 
    FROM data 
) 
SELECT a.id, DATEPART(HOUR, a.AtHour) as AtHour, COUNT(*) AS NumOfPairs 
FROM temp a JOIN temp b ON a.rownum = b.rownum-1 
WHERE a.Event BETWEEN 1 and 20 AND b.Event >= 200 
AND DATEDIFF(MINUTE, a.AtHour, b.AtHour) <= 60 
GROUP BY a.id, DATEPART(HOUR, a.AtHour) 
; 
+0

예제를 시도해 보셨습니까? –

+0

죄송합니다. 질문에서 "1 시간 이내"부분을 잊어 버렸습니다. 다시해볼 수 있니? –

+0

문제를 설명하는 샘플 데이터로 rextester 데모를 설정할 수 있습니까? –