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:等效于计算当前行之前的行的窗口平均值的主要内容,如果未能解决你的问题,请参考以下文章