如何将 table 拆分为块和每个块的 select AVG
How to split table to chunks and select AVG of each chunk
MySQL 5.7
我有一个table没有主键(用于统计):
|value| date|
|-----+----------|
| 1|13-03-2019|
| 2|12-03-2019|
| 3|16-03-2019|
| 4|16-03-2019|
| 5|16-03-2019|
| 6|16-03-2019|
如何将 table 拆分为 N 个块,以及 select avg(value)
个每个块?
预期结果,如果上面示例中的 table 与块大小 = 3 一起使用:
|avg_val|
| 2|
| 5|
您可以使用以下使用模拟行号的解决方案(自 MySQL 8.0 起支持 ROW_NUMBER
,因此您不能使用此解决方案):
SELECT AVG(value)
FROM (
SELECT value, CEIL((@row_number:=@row_number + 1) / 3) AS group_num
FROM table_name, (SELECT @row_number:=0) rownumber
) t1
GROUP BY t1.group_num;
从 MySQL 8.0 开始,您可以使用以下解决方案(以防您稍后升级并为了完整性),使用 ROW_NUMBER
:
SELECT AVG(value)
FROM (
SELECT value, CEIL(ROW_NUMBER() OVER () / 3) AS group_num
FROM table_name
) t1
GROUP BY t1.group_num;
MySQL 5.7
我有一个table没有主键(用于统计):
|value| date|
|-----+----------|
| 1|13-03-2019|
| 2|12-03-2019|
| 3|16-03-2019|
| 4|16-03-2019|
| 5|16-03-2019|
| 6|16-03-2019|
如何将 table 拆分为 N 个块,以及 select avg(value)
个每个块?
预期结果,如果上面示例中的 table 与块大小 = 3 一起使用:
|avg_val|
| 2|
| 5|
您可以使用以下使用模拟行号的解决方案(自 MySQL 8.0 起支持 ROW_NUMBER
,因此您不能使用此解决方案):
SELECT AVG(value)
FROM (
SELECT value, CEIL((@row_number:=@row_number + 1) / 3) AS group_num
FROM table_name, (SELECT @row_number:=0) rownumber
) t1
GROUP BY t1.group_num;
从 MySQL 8.0 开始,您可以使用以下解决方案(以防您稍后升级并为了完整性),使用 ROW_NUMBER
:
SELECT AVG(value)
FROM (
SELECT value, CEIL(ROW_NUMBER() OVER () / 3) AS group_num
FROM table_name
) t1
GROUP BY t1.group_num;