我有一个包含点击/下载列表的表,每行当然都有一个日期。 我能够按天分组所有行。
您是否认为从整个点击列表开始,还可以使用单个查询计算每日总和与前一天相比的百分比变化?
我试图这样做
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%
显然可以是积极的或消极的
答案 0 :(得分:2)
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)
答案 1 :(得分:1)
白天的总和是:
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;