如何将 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;

demo on dbfiddle.uk