2012-10-22 6 views
3

의 그룹화하여 시퀀스 I가 다음과 같은 열 및 데이터를 포함하는 테이블 : '를 함께 D의 데이터 열에서'나는 그룹 시퀀스에 원하는SQL 쿼리 도움말 - 숫자

id  dtime  instance  data  dtype 

1  2012-10-22  10000  d  1 
2  2012-10-22  10000  d  1 
.. 
7  2012-10-22  10004  d  1 
.. 
15 2012-10-22  10000  @  1 
16 2012-10-22  10004  d  1 
17 2012-10-22  10000  d  1 

를 @ ' 시퀀스의 끝에서.

이 작업은 데이터의 개별 스트림 인 인스턴스 열을 통해 그룹화 할 수 있지만 스트림 내에 여러 시퀀스가있을 수 있습니다.

또한 예를 들어, 해당 인스턴스의 마지막 데이터로부터 3 초 후에 동일한 인스턴스에 데이터 열이없고 그 간격 내에 '@'가없는 경우 시퀀스를 종료하려고합니다.

커서와 while 루프를 사용하여 정확히 1000 개 행의 테이블에서 정상적으로 작동하지만이 쿼리는 결국 더 많은 행에 사용됩니다.이 두 메서드는 약 1 분 정도 걸릴 것입니다. 3-5000 행의 데이터 세트.

이 웹 사이트 및 다른 사람들을 읽으면서 세트 기반 논리가 될 수있는 것처럼 보이지만 모든 행과 비교하여 모든 행을 반복하지 않으면 필자가 원하는 것을 할 방법이 없다고 생각할 수 있습니다. 다른 '시퀀스'를 구축 할 수 있습니다.

누구든지 도움이 될 수 있거나 뭔가 할 수있는 방향으로 나를 지적하면 크게 환영 할 것입니다. :)

내가 이상적으로 데이터가 다음과 같은 형식의 출력이되고 싶습니다 :

datacount 인스턴스는 dtime lastdata (datacount가)의 행의 수를입니다

20  10000 @  2012-10-22 

19  10000 d  2012-10-22 

22  10004 @  2012-10-22 

20  10022 @  2012-10-22 

에 ' 시퀀스 ('@'또는 3 초 지연까지 이어지는 데이터), (인스턴스)는 원래 테이블의 인스턴스 ID, (lastdata)는 시퀀스의 마지막 데이터 값, (dtime)은 datetime 마지막 데이터 값의 값.

+0

질문에 게시 한 데이터의 출력은 얼마나됩니까? –

+0

죄송합니다. 질문에이 글을 추가하는 것을 잊어 버렸습니다. 이제 수정하고 필요한 출력을 하단에 추가했습니다. – gabbiccino

+0

원시 데이터에서 결과 집합을 작성하는 데 너무 오래 걸리는 경우 예를 들어를 사용하여 결과 집합을 바로 작성할 수 있습니다. 트리거 –

답변

1

최종 '@'에 대해이 작업을 수행하는 방법을 알려 드리겠습니다. 시간차도 비슷한 생각입니다. 핵심 아이디어는 현재 행 뒤에 다음 '@'를 얻는 것입니다. 이를 위해서는 상관 관계가있는 하위 쿼리가 필요합니다. 그 후에 그룹을 만들 수 있습니다.

select groupid, count(*) as NumInSeq, max(dtime) as LastDateTime 
from (select t.*, 
      (select min(t2.id) from t t2 where t2.id > t.id and t2.data = '@' 
      ) as groupid 
     from t 
    ) t 
group by groupid 

시간 순서를 처리하는 것은 좀 더 복잡합니다. 다음과 같은 내용입니다.

select groupid, count(*) as NumInSeq, max(dtime) as LastDateTime, 
     (case when sum(case when data = '@' then 1 else 0 end) > 0 then '@' else 'd' end) as FinalData 
from (select t.*, 
      (select min(t2.id) 
       from t t2 
       where t2.id > t.id and 
        (t2.data = '@' or UNIX_TIMESTAMP(t2.dtime) - UNIX_TIMESTAMP(t.dtime) < 3 
      ) as groupid 
     from t 
    ) t 
group by groupid 
+0

감사합니다. Gordon, 쿼리가 반환되기 전에 시간이 초과되었습니다.하지만 더 작은 데이터 세트에서 시도해보고 속도 저하의 원인을 찾아 냈습니다. – gabbiccino

+0

유감스럽게도 상관 관계가있는 하위 쿼리는 최적화되지 않습니다. 다른 데이터베이스에서는 대체 솔루션으로 창 함수를 사용하지만 MySQL에서는 사용할 수 없습니다. (id, data)에 대한 색인이 있고 시간 제한을 해제하면 도움이 될 수 있습니다. –

+0

더 나은 순서로 정렬 된 데이터 세트에 대한 쿼리를 재 시도했으며 while 루프 메소드가 수행하는 약 4 분의 1에서 실행됩니다. 1 개의 데이터 행이 17로 계산되는 이상한 결과가 아직 몇 가지 있습니다. 이해할 수는 없지만 계속 노력할 것입니다. 당신의 도움을 주셔서 감사합니다. :) – gabbiccino