2012-03-20 4 views
6

아이디어는 다음 표가 있다고 가정합니다.SQL GROUP BY : 연속성 간격?

------------- 
| oID | Area| 
------------- 
| 1 | 5  | 
| 2 | 2  | 
| 3 | 3  | 
| 5 | 3  | 
| 6 | 4  | 
| 7 | 5  | 
------------- 

연속성에 의해 그룹화 연속성 휴식이 OID 4 나타내는 항목 그 부족 OID 또는 오히려 발생하는 경우

------------- 
| SUM(Area) | 
------------- 
| 10  | 
| 12  | 
------------- 

을 반환이 의사 쿼리

SELECT SUM(Area) FROM sample_table GROUP BY CONTINUITY(oID) 

에게 가능합니다.

이러한 기능은 Sql의 표준 기능 내에 있습니까?

답변

5

"SQL의 표준 기능"에는 이러한 기능이 없지만 몇 가지 트릭을 사용하여 원하는 결과 집합을 얻을 수 있습니다.

아래 그림의 하위 쿼리를 사용하면 바깥 쿼리에서 GROUP BY에 사용할 수있는 가상 필드를 만들 수 있습니다. 이 가상 필드의 값은 oID 시퀀스에 간격이있을 때마다 증가합니다. 우리가 그 "데이터 아일랜드"의 각각에 대한 식별자를 만드는이 방법 :

SELECT SUM(Area), COUNT(*) AS Count_Rows 
FROM (
     /* @group_enumerator is incremented each time there is a gap in oIDs continuity */ 
     SELECT @group_enumerator := @group_enumerator + (@prev_oID != oID - 1) AS group_enumerator, 
       @prev_oID := oID AS prev_oID, 
       sample_table.* 
     FROM (
       SELECT @group_enumerator := 0, 
         @prev_oID := -1 
       ) vars, 
       sample_table 
     /* correct order is very important */ 
     ORDER BY 
       oID 
     ) q 
GROUP BY 
     group_enumerator 

테스트 테이블 및 데이터 생성 :

CREATE TABLE sample_table (oID INT auto_increment, Area INT, PRIMARY KEY(oID)); 
INSERT INTO sample_table (oID, Area) VALUES (1,5), (2,2), (3,3), (5,3), (6,4), (7,5); 

내가 this trick in my related question ;-)

을 지적 Quassnoi 감사합니다

UPDATE : 예제 쿼리에서 테스트 테이블과 데이터를 추가하고 중복 된 열 이름을 고정했습니다.

0

다음은 grouping by contiguous data과 관련된 매우 철저한 설명과 예제를 제공하는 블로그 게시물입니다. 이해하는 데 문제가 있거나 구현하는 데 문제가 있으면 구현을 제공 할 수 있습니다.

+0

임시 테이블을 사용하지 않고도이 작업을 수행 할 수 있습니다. – Kaii