[英]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;
如果要获取从最近日期算起的最近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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.