id originator revenue date
1 acme 1 2013-09-15
2 acme 0 2013-09-15
3 acme 4 2013-09-14
4 acme 6 2013-09-13
5 acme -6 2013-09-13
6 hello 1 2013-09-15
7 hello 0 2013-09-14
8 hello 2 2013-09-13
9 hello 5 2013-09-14
我有上面的表格。并且我想根据最近3天的收入添加基于发起人产生的收入的排名列
需要显示的字段如下:
originator revenue toprank
hello 8 1
acme 5 2
2) 根据以上数据,我想根据以下标准计算产生的平均收入
如果同一日期的总收入之和为 0(零),则不应计算平均值。
a) 发起者 acme 的平均值应该是收入/计数的总和(收入不为零值的日期数),所以 (4+1)/2 即 2.5
b) originator hello 的平均值应该是收入/计数的总和(收入非零值的日期数)所以 (5+2+1)/3 即 2.6666
originator revenue toprank avg(3 days)
hello 8 1 2.6666
acme 5 2 2.5
最佳答案
您首先需要按日期对记录进行分组,以便找到每日总计并排除总和为零的那些天。
然后将该查询用作子查询,您可以从中再次分组以按发起者获取总计和平均值。
最后,执行排名(在您的应用程序代码中循环遍历结果集,或者在 MySQL 中使用带有用户变量的外部查询)。
SELECT originator, revenue, @r:=@r+1 AS toprank, avg FROM (
SELECT originator, SUM(total) AS revenue, AVG(total) AS avg
FROM (
SELECT originator, date, SUM(revenue) AS total
FROM my_table
-- WHERE date BETWEEN CURRENT_DATE - INTERVAL 3 DAY AND CURRENT_DATE
GROUP BY originator, date
HAVING total <> 0
) t
GROUP BY originator
ORDER BY revenue DESC
) t, (SELECT @r:=0) init
查看 sqlfiddle .
关于mysql group by 平均计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18867645/