2011-03-01 35 views
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

當我想要做到這一點時,有沒有更好的方法來做到這一點。 – 2011-03-01 21:57:30

+0

@Steven - 多次總計?是的,每個運行總數有一對變量 – RichardTheKiwi 2011-03-01 21:59:33

+0

另外這也有一個缺陷,如果不是每天都有一個記錄在數據集中,它將無法正確執行。它會將當前行與前兩行相加,不一定是前兩天。 – 2011-03-01 22:00:33

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好工作。 ;) – 2011-03-01 21:00:36

+0

你的回答讓我走上了正軌。我做了什麼,而不是與其他表加入,是執行一個子查詢。這裏是「select t1.Date,t1.Total,(Select sum(Total)from keywordSum where Date <= t1.Date and Date> = Date(t1.Date-2))from keywordSum t1 limit 5; – 2011-03-01 21:01:17

+0

@steven很高興聽到它讓你走上正軌。子查詢也可以工作。我不確定你是否需要這個「極限5」。 – 2011-03-01 21:09:58