2011-03-01 4 views
2

나는 현재 날짜와 지난 2 일 합계를 3 일간의 후행 합계로 계산하는 방법을 찾기 위해 날짜와 요일을 요약하고자합니다. MariaDB, MYSQL 포크를 사용하고 있습니다.후행 합계 쿼리

다음은 데이터의 하위 집합입니다.

select Date, Total from keywordSum limit 5; 
+------------+--------+ 
| Date  | Total | 
+------------+--------+ 
| 2010-11-11 | 316815 | 
| 2010-11-12 | 735305 | 
| 2010-11-13 | 705116 | 
| 2010-11-14 | 725020 | 
| 2010-11-15 | 745378 | 
+------------+--------+ 

나는이 유사한 결과를 끝내고 싶습니다

+------------+--------+-----------+ 
| Date  | Total | 3DayTotal | 
+------------+--------+-----------+ 
| 2010-11-11 | 316815 | 316815 | 
| 2010-11-12 | 735305 | 1052120 | 
| 2010-11-13 | 705116 | 1757236 | 
| 2010-11-14 | 725020 | 2167441 | 
| 2010-11-15 | 745378 | 2177514 | 
+------------+--------+-----------+ 

심지어 NaN의를 인쇄 할 수 있습니다 또는 이전 일이 존재하지 않는 경우 비워 둡니다. 어떤 생각이나 제안이라도 대단히 감사하겠습니다.

답변

2

MySQL의 변수를 사용하는 빠른 방법

샘플 테이블 :

create table keywordsum (date datetime, total int); 
insert keywordsum values 
('2010-11-11',316815), 
('2010-11-12',735305), 
('2010-11-13',705116), 
('2010-11-14',725020), 
('2010-11-15',745378); 

검색어 :

select 
    k.date, k.total, k.total + ifnull(@d1,0) + ifnull(@d2,0) running_total, 
    @d2 := @d1, 
    @d1 := k.total 
from (select @d1 := null, @d2 := null) vars 
cross join keywordsum k 
order by k.date 

(당신은 항상이 첫 번째 3 열을 얻기 위해 부속 선택 가능)

+0

이 작업을 수행하고자하는 많은 열이 포함되어있을 때이 더 나은 방법이 있습니다. –

+0

@Steven - 여러 개의 합계가 있습니까? 예, 실행중인 총계 당 한쌍의 변수로 – RichardTheKiwi

+0

또한 매일 데이터 세트에 레코드가 없으면 올바르게 작동하지 않는다는 단점이 있습니다. 이전 2 일과 현재 2 일을 합한 것입니다. –

3

하나의 간단한 방법은 테이블을 자체에 가입시키는 것입니다. 날짜와 총합의 조합으로 색인이 생성되었는지 확인하십시오.

select t1.date 
    , t1.total 
    , t1.total 
     +coalesce(t2.total,0) 
     +coalesce(t3.total,0) 
    from theTable t1 
    left 
    join theTable t2 on t1.date = date_Add(t2.date,interval 1 day) 
    left 
    join theTable t3 on t1.date = date_Add(t3.date,interval 2 day) 
+0

+1 좋은 직장. ;) –

+0

당신의 답은 올바른 길로 나를 잡았습니다. 내가 다른 테이블과 결합하는 대신 서브 쿼리를 실행했습니다. 여기서는 "select t1.Date, t1.Total, (keywordSum에서 Date <= t1.Date 및 Date> = Date (t1.Date-2) 인 keywordSum을 선택하십시오)는 keywordSum t1 limit 5의 3DayTotal로" –

+0

@steven 기쁜 소식을 듣고 나면 잘 지내고 있습니다. 하위 쿼리도 작동합니다. "LIMIT 5"가 필요하지만 확실하지 않습니다. –