2013-07-26 8 views
3

표시하기 위해 집계를 수행해야하는 데이터 집합이 있습니다.SQL 집계 쿼리

Date,  Rank, Vote 

07/20/2013, 8, -1 
07/21/2013, 8, -1 
07/23/2013, 7, -1 
07/24/2013, 6, 1 
07/25/2013, 7, 1 
07/26/2013, 7, -1 
07/27/2013, 8, 1 
07/28/2013, 8, 1 
07/29/2013, 8, -1 

연속적인 등급으로 그룹화하고, 투표를 합산하고, 그룹화 된 날짜 중 첫 번째를 선택하고 싶습니다. 위의 데이터 세트는 다음과 같이 반환됩니다.

07/20/2013,8,-2 
07/23/2013,7,-1 
07/24/2013,6,1 
07/25/2013,7,0 
07/27/2013,8,1 

첫 번째 생각은 GROUP BY 날짜 및 순위이지만 여러 날짜를 통합하지 않습니다. 사실을 데이터를 통해 루핑 한 후이 작업을 수행 할 수 있습니다 또는 저장 프로 시저 내에서 커서를 사용할 수 있지만 SQL 쿼리를 사용하여 간단한 방법이 궁금하다.

+0

날짜 날짜 유형을 사용 하시겠습니까? – Strawberry

답변

2

이 그것을하지 : 내가 볼 수

SELECT firstDate, Rank, SUM(vote) Votes 
FROM (
    SELECT @first_date := CASE WHEN Rank = @prev_rank 
           THEN @first_date 
           ELSE Date 
          END firstDate, 
      @prev_rank := Rank curRank, 
      data.* 
    FROM (SELECT @first_date := NULL, @prev_rank := NULL) init 
    JOIN (SELECT Date, Rank, Vote 
      FROM MyTable 
      Order by Date) data 
    ) grouped 
GROUP BY firstDate, Rank 

SQLFIDDLE

0

가장 간단한 방법은, 이미 지적한 것입니다. SQL함으로써

사용 그룹 :

SELECT date, rank, SUM(vote) FROM YourTable 
GROUP BY date, rank 

바이올린 데모 :이 레코드 프로그램에서 설정하고 데이터를 얻기 위해 필요한 일을 통해 http://sqlfiddle.com/#!2/d65d5c/3

으로 반복. (질문에 프로그래밍 언어로 태그를 지정하면 방법을 보여줄 수 있습니다).

기본적으로 아니오,이 작업을 수행하는 더 좋은 방법은 없습니다. 지금까지 볼 수 있듯이 이것은 매우 복잡하고 느린 SQL 쿼리로 끝날 것입니다. 하지만 어쩌면 누군가가 나를 더 잘 가르쳐 줄 수 있습니다.

+1

그는 프로그래밍 언어에서 루핑하여이를 수행하는 방법을 알고 있다고 말하면서, 그의 질문은 SQL에서 추가적인 그룹화를 완전히 할 수있는 방법이 있는지의 여부입니다. – Barmar

+0

네, 제 대답은 이런 식으로하는 것입니다. SQL로 그룹화하고 나머지는 RAM에서 수행하십시오. –

+0

당신의 대답은 "아니오"입니까? 그룹에서 순위를 계산하는 방법과 비슷한 추가 변수를 사용하여 SQL로 수행 할 수 있다고 확신합니다. – Barmar