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)发起人极端的平均值应为收入/计数的总和(收入为非零值的日期之和),因此(4 + 1)/ 2,即2.5
b)发起人你好的平均值应该是收入/计数的总和(收入为非零值的日期之和)所以(5 + 2 + 1)/ 3 即 2.6666originator revenue toprank avg(3 days)
hello 8 1 2.6666
acme 5 2 2.5
答案 0 :(得分:2)
您首先需要按日期对记录进行分组,以便查找每日总计并排除总和为零的那些天。
然后将该查询用作子查询,再次将其分组以获取发起人的总计和平均值。
最后,执行排名(在循环结果集时在应用程序代码中,或者在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上查看。