Clickhouse:等效于计算当前行之前的行的窗口平均值

Posted

技术标签:

【中文标题】Clickhouse:等效于计算当前行之前的行的窗口平均值【英文标题】:Clickhouse: Equivalent for calculating window mean with rows preceding current row 【发布时间】:2018-07-23 20:10:47 【问题描述】:

我正在努力寻找滚动平均函数的替代方法。典型窗口函数的等价物如下:

select avg(sales) over (partition by country order by date rows between 4 preceding and 1 preceding) as rolling_mean_last_4
from country_sales

提前非常感谢!

【问题讨论】:

【参考方案1】:

目前 ClickHouse 中不支持功能齐全的窗口功能。不过,一些解决方法通常是可行的。

例如,您可以尝试将此 PARTITION BY 替换为 GROUP BY + groupArray,然后使用 higher order functions 获得所需的结果。如果 GROUP BY 的行数减少是不可接受的,那么您必须找到一种适当的方法将其 JOIN 回原始表。

听起来很麻烦,但在有利的情况下可能会工作。

【讨论】:

【参考方案2】:

从version 21.4开始添加了对窗口函数的完整支持。此时它被标记为实验性功能

SELECT
    date,
    country,
    sales,
    avg(sales) OVER (PARTITION BY country ORDER BY date ASC ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING) AS rolling_mean_last_4
FROM 
(
    /* Emulate the test dataset. */
    SELECT
        toDateTime('2010-01-01') + number AS date,
        toInt32(number / 8) AS country,
        number AS sales
    FROM numbers(32)
)
SETTINGS allow_experimental_window_functions = 1

/*
┌────────────────date─┬─country─┬─sales─┬─rolling_mean_last_4─┐
│ 2010-01-01 00:00:00 │       0 │     0 │                 nan │
│ 2010-01-01 00:00:01 │       0 │     1 │                   0 │
│ 2010-01-01 00:00:02 │       0 │     2 │                 0.5 │
│ 2010-01-01 00:00:03 │       0 │     3 │                   1 │
│ 2010-01-01 00:00:04 │       0 │     4 │                 1.5 │
│ 2010-01-01 00:00:05 │       0 │     5 │                 2.5 │
│ 2010-01-01 00:00:06 │       0 │     6 │                 3.5 │
│ 2010-01-01 00:00:07 │       0 │     7 │                 4.5 │
│ 2010-01-01 00:00:08 │       1 │     8 │                 nan │
│ 2010-01-01 00:00:09 │       1 │     9 │                   8 │
│ 2010-01-01 00:00:10 │       1 │    10 │                 8.5 │
│ 2010-01-01 00:00:11 │       1 │    11 │                   9 │
│ 2010-01-01 00:00:12 │       1 │    12 │                 9.5 │
│ 2010-01-01 00:00:13 │       1 │    13 │                10.5 │
│ 2010-01-01 00:00:14 │       1 │    14 │                11.5 │
│ 2010-01-01 00:00:15 │       1 │    15 │                12.5 │
│ 2010-01-01 00:00:16 │       2 │    16 │                 nan │
│ 2010-01-01 00:00:17 │       2 │    17 │                  16 │
│ 2010-01-01 00:00:18 │       2 │    18 │                16.5 │
│ 2010-01-01 00:00:19 │       2 │    19 │                  17 │
│ 2010-01-01 00:00:20 │       2 │    20 │                17.5 │
│ 2010-01-01 00:00:21 │       2 │    21 │                18.5 │
│ 2010-01-01 00:00:22 │       2 │    22 │                19.5 │
│ 2010-01-01 00:00:23 │       2 │    23 │                20.5 │
│ 2010-01-01 00:00:24 │       3 │    24 │                 nan │
│ 2010-01-01 00:00:25 │       3 │    25 │                  24 │
│ 2010-01-01 00:00:26 │       3 │    26 │                24.5 │
│ 2010-01-01 00:00:27 │       3 │    27 │                  25 │
│ 2010-01-01 00:00:28 │       3 │    28 │                25.5 │
│ 2010-01-01 00:00:29 │       3 │    29 │                26.5 │
│ 2010-01-01 00:00:30 │       3 │    30 │                27.5 │
│ 2010-01-01 00:00:31 │       3 │    31 │                28.5 │
└─────────────────────┴─────────┴───────┴─────────────────────┘
*/

见https://altinity.com/blog/clickhouse-window-functions-current-state-of-the-art。

【讨论】:

以上是关于Clickhouse:等效于计算当前行之前的行的窗口平均值的主要内容,如果未能解决你的问题,请参考以下文章

R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数

ClickHouse数据仓库使用之limit实践

4月13日

Jquery按日期隐藏表格行的方法

linux进入vim的编辑模式与命令模式操作命令

在当前行中,对代表上周(7 天)记录的行的数据求和