mysql group by 平均计算

标签 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) 发起者 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/

相关文章:

mysql - 将 mySQL 中的时间戳更改为日期

mysql - 当您有外键时插入一行

mysql - Grafana使用mysql数据库做图报错1064

MySQL - 选择不在分组依据中的列

python - Airflow:如何将 PyMySQL 与 MySQL Hook 结合使用?

php - mysql 查询适用于纯文本,但不适用于变量

mysql - Vbulletin 错误 1062 (23000) 位于第 38766 行 : Duplicate entry

mysql - 分配的准备好的查询错误语法错误

javascript - 音频流 Node js

php - SQL 按当天排序