SQL总和每天点击并计算百分比变化

时间:2014-07-06 18:10:46

标签: mysql sql union percentage

我有一个包含点击/下载列表的表,每行当然都有一个日期。 我能够按天分组所有行。

您是否认为从整个点击列表开始,还可以使用单个查询计算每日总和与前一天相比的百分比变化?

我试图这样做

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%

显然可以是积极的或消极的

2 个答案:

答案 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;
相关问题