[英]SQL sum hits per day and calculate percentage change
我有一個表格,其中列出了點擊量/下載量,每行當然都有一個日期。 我能夠匯總按天分組的所有行。
您認為是否也可以使用單個查詢從整個匹配列表中計算出每日總金額與前一天相比的百分比變化?
我試圖做到這一點
select *, temp1.a-temp2.b/temp1.a*100 as percentage from
(select DATE(date), count(id_update) as a from vas_updates group by DATE(date)) as table1
UNION
(select DATE_ADD(date, INTERVAL 1 DAY), count(id_update) as b from vas_updates group by DATE(date)) as table2, vas_updates
但它不起作用(100%CPU +崩潰)。 當然,我不能加入它們,因為這兩個臨時表在1天的偏移量下沒有任何共同點。
桌子看起來像這樣,沒什么花哨的。
id_updates | date
1 2014-07-06 12:45:21
2 2014-07-06 12:46:10
3 2014-07-07 10:16:10
而且我要
date | sum a | sum b | percentage
2014-07-07 2 1 -50%
顯然可以是正數或負數
select DATE(v.date), count(v.id_update) a, q2.b, count(v.id_update) - q2.b/count(v.id_update)*100 as Percentage
from vas_updates v
Left Join (select DATE_ADD(date, INTERVAL 1 DAY) d2, count(id_update) as b
from vas_updates group by d2) as q2
ON v.date = q2.d2
group by DATE(v.date)
每天的總和是:
select DATE(date), count(id_update) as a
from vas_update
group by DATE(date);
在MySQL中,獲得先前值的最簡單方法是使用變量,它看起來像這樣:
select DATE(u.date), count(u.id_update) as cnt,
@prevcnt as prevcnt, count(u.id_update) / @prevcnt * 100,
@prevcnt := count(u.id_update)
from vas_update u cross join
(select @prevcnt := 0) vars
group by DATE(u.date)
order by date(u.date);
這通常會在實踐中起作用,但是MySQL不保證變量的順序。 一種更有保證的方法如下所示:
select dt, cnt, prevcnt, (case when prevcnt > 0 then 100 * cnt / prevcnt end)
from (select DATE(u.date) as dt, count(u.id_update) as cnt,
(case when (@tmp := @prevcnt) is null then null
when (@prevcnt := count(u.id_update)) is null then null
else @tmp
end) as prevcnt
from vas_update u cross join
(select @prevcnt := 0, @tmp := 0) vars
group by DATE(u.date)
order by date(u.date)
) t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.