繁体   English   中英

mysql分组查询平均计算

[英]mysql group by query with average calculation

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

要在平均时忽略一行,请给AVG一个空值。 NULLIF函数对此很有用。

在MySQL中,排名是有问题的。 它不支持使分析在Oracle,MySQL,Teradata等中更容易执行的分析功能。最常见的解决方法是使用计数器变量,并且需要有序的行集,这意味着总收入必须在内部查询中计算。

SELECT originator, TotalRev, Avg3Days, @rnk := @rnk + 1 AS TopRank
FROM (
  SELECT
    originator,
    SUM(revenue) AS TotalRev,
    AVG(NULLIF(revenue, 0)) AS Avg3Days
  FROM myTable
  GROUP BY originator
  ORDER BY TotalRev DESC
) Tots, (SELECT @rnk := 0) Ranks

如果要获取从今天起最近3天的值,请尝试以下操作:

SET @rank=0;

select originator, rev, @rank:=@rank+1 AS rank, avg 
FROM 
(select originator, sum(revenue) as rev, 
AVG(NULLIF(revenue, 0)) as avg
FROM t1
WHERE date >= DATE_ADD(CURDATE(), INTERVAL -3 DAY)
group by originator
order by 2 desc) as t2;

SQL小提琴

编辑:

如果要获取从最近日期算起的最近3天的值,请尝试以下操作:

SET @rank=0;

select originator, rev, @rank:=@rank+1 AS rank, avg 
from 
(select originator, sum(revenue) as rev, 
AVG(NULLIF(revenue, 0)) as avg
from t1
WHERE date >= DATE_ADD((select max(date) from t1), INTERVAL -3 DAY)
group by originator
order by 2 desc) as t2;

SQL小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM