【问题标题】:How to split table to chunks and select AVG of each chunk如何将表拆分为块并选择每个块的 AVG
【发布时间】:2019-08-09 15:30:06
【问题描述】:

MySQL 5.7

我有一个没有主键的表(用于统计):

|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|

如何将表拆分为 N 个块,并选择每个块的 avg(value)

预期结果,如果上面示例中的表与块大小 = 3 一起使用:

|avg_val|
|      2|
|      5|

【问题讨论】:

    标签: mysql mysql-5.7


    【解决方案1】:

    您可以通过模拟行号使用以下解决方案(自 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

    【讨论】:

    • 谢谢!关于这个query,我可以再问你一个问题吗?我想将最后一小时内的所有记录分块为 60 条记录。取而代之的是 3 在你的回答中我使用select()/60 - 这是最优的吗?
    • 小时(时间)存储在哪里?
    • 您想获得每小时价值的平均值还是仅获得最后一小时的平均值?
    • dbfiddle.uk/… - 我添加了一个最大块,这样你就可以定义一个最小块大小(这里是 10)。你得到三行的原因是计算 3 / 60 = 0.05。所以每一行都是另一个 group_num (没有超过一个项目的组)。在这种情况下,最大的你得到 10,因为 10 > 0.05。使用您描述的数据量,查询应该可以工作。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多