1
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) 发起人 hello 的平均值应该是收入/计数的总和(收入非零值的日期的数量),因此(5+2+1)/32.6666

originator revenue toprank avg(3 days)

hello            8       1      2.6666
acme             5       2      2.5
4

1 回答 1

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

于 2013-09-18T09:02:38.173 回答