微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Clickhouse: runningAccumulate() 不像我预期的那样工作

如何解决Clickhouse: runningAccumulate() 不像我预期的那样工作

比如说,我们有一张桌子 testint

        SELECT *
    FROM testint
    
    ┌─f1─┬─f2─┐
    │  2 │  3 │
    │  2 │  3 │
    │  4 │  5 │
    │  4 │  5 │
    │  6 │  7 │
    │  6 │  7 │
    └────┴────┘

我们尝试使用 runningAccumulate() 查询 sumState()

    SELECT runningAccumulate(col)
    FROM 
    (
        SELECT sumState(f1) AS col
        FROM testint
        GROUP BY f1
    )
    
    ┌─runningAccumulate(col)─┐
    │                      8 │
    │                     12 │
    │                     24 │
    └────────────────────────┘

为什么响应中的第一行是 8,而不是 4?如果我们按 f1 分组,第一行似乎是 4(我们对 2 列中的第一个 2 和第二个 f1 求和)。

解决方法

对于累加函数,元素的顺序很重要,所以只需添加 ORDER BY 来修复它:

SELECT runningAccumulate(col)
FROM 
(
    SELECT sumState(f1) AS col
    FROM testint
    GROUP BY f1
    ORDER BY f1 ASC /* <-- */
)

You got the result [8,12,24] for input data [8,4,12] 什么时候应该使用有序输入 - [ 4,8,12]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。