2013-08-18 1 views
2

SQL과 페어링하는 것과 관련된 많은 질문을 읽었지만 이와 같은 세션 카운터는 사용하지 않았습니다. 많은 사람들에게 적용될 수있는 문제의 일반적인 사례를 단순화했습니다. 내가 그 데이터를 가지고 싶습니다세션 카운터를 기반으로 한 이벤트 페어링 및 mySQL의 시간 델타 찾기

time counter 
t0 0 
t1 1 
t2 2 
t3 0 
t4 1 
t5 0 
t6 1 
t7 2 
t8 3 
t9 4 

: 기본적으로

나는 MySQL의 테이블은 각각의 타임 스탬프마다 새로운 세션 0으로 재설정 증분 "세션 카운터 '와 이벤트,과 같이 기록이 모든 세션의 첫 번째 및 마지막 타임 스탬프를 쌍으로 만들어 (그리고 결국 시간 델타를 계산) 세션 당 1 행으로 만듭니다. 그래서 원하는 출력은 다음과 같이 될 것이다 : 나는 LEAD와 LAG 함수를 사용하여 몇 가지 솔루션을 읽은

start counter end counter 
t0  0  t2 2 
t3  0  t4 1 
t5  0  t9 4 

,하지만 MySQL의에서 사용할 수없는 및 대체 구현 이해 내 수준을 넘어이다. 나는 Excel/Python에서 이것을 강요 할 수 있다는 것을 알고 있지만 이것을 수행 할 수있는 상대적으로 간단한 mySQL 쿼리가 있는가?

답변

0

당신은 여기 User-Defined Variables

를 사용하여 MySQL의에서 LEAD 기능을 에뮬레이트 할 수있는 하나의 예

SQLFiddle

또는 여기에 또 다른 SQL 쿼리가

select min(time),max(time),count(*)-1 
from 
(
select time,counter, 
if(@prev>counter,@grp:[email protected]+1,@grp:[email protected]), 
@grp as GRPvalue, 
@prev:=counter 
from t,(select @prev:=0,@grp:=0) as t1 
order by time 
) t2 
GROUP BY GRPValue 
order by min(time) 
이다. 여기에서 우리는 (모든 간격은 0으로 시작하는 경우) 현재 레코드 전에 counter=0의 카운트로 그룹을 정의 :

select min(time),max(time),count(*)-1 
from t t1 
group by 
(select count(*) from t where t.time<=t1.time and counter = 0) 

SQLFiddle demo

관련 문제