我有以下表格数据:
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 。
range
avg
value
您可以使用UNION ALL和LEFT JOIN一起建立范围列表:
UNION ALL
LEFT 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)范围。
20.9999
[0-21)
21.0000
[21-34)