一尘不染

MySQL如何将平均值取到特定范围内

sql

我有以下表格数据:

value
1
5
10.5
12
36

我想将这些值映射到:

range      avg
0-21       (1 + 5 + 10.5 + 12) / 4
21.001-34  0
34.001-64  36
64 +       0

基本上将每个值映射到范围,并计算每个范围内所有值的平均值。

我试着做:

select 
case
when avggeneral between 0 and 21 then ' 0-21'
when avggeneral between 21.00001 and 34 then ' 21-34'
when avggeneral between 34.00001 and 64 then ' 34-64'
else '64+'
end as 'range',
AVG(*) as 'avg'
from table

但这不起作用…我不知道如何制作静态范围…

如何在MySQL中做到这一点?

方法应为:1.将值映射到这些组中(0-21、21-34等。)2.计算每组中的AVG。

上面示例的所需输出是这样的:

range      avg
0-21       7.125
21.001-34  0
34.001-64  36
64 +       0

range列是静态的。始终带有5行。该avg列是动态的。值是该value列的实际AVG 。


阅读 188

收藏
2021-05-23

共1个答案

一尘不染

您可以使用UNION ALLLEFT JOIN一起建立范围列表:

SELECT CONCAT(IFNULL(ranges.min, '鈭�'), '-', IFNULL(ranges.max, '鈭�')) AS `range`, avg(value) AS avg
FROM (
    SELECT 0 AS min, 21 AS max UNION ALL
    SELECT 21, 34 UNION ALL
    SELECT 34, 64 UNION ALL
    SELECT 64, NULL
) AS ranges
LEFT JOIN t ON (ranges.min IS NULL OR value >= ranges.min) AND
               (ranges.max IS NULL OR value <  ranges.max)
GROUP BY ranges.min, ranges.max

请注意,上面的查询将放入20.9999内部[0-21)21.0000内部[21-34)范围。

2021-05-23