用平均值计算mysql组

时间:2013-09-18 08:46:07

标签: mysql

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.6666

originator revenue toprank avg(3 days)

hello            8       1      2.6666
acme             5       2      2.5

1 个答案:

答案 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上查看。