Clickhouse:如何获得 2 个连续行的平均值?

Posted

技术标签:

【中文标题】Clickhouse:如何获得 2 个连续行的平均值?【英文标题】:Clickhouse: How to get averages of 2 consecutive rows? 【发布时间】:2022-01-22 21:17:33 【问题描述】:

创建表 sensor_2 ( 当 DateTime64 时, 值 Float32 ) 引擎=合并树 PARTITION BY toYYYYMM(when) ORDER BY (when)

INSERT INTO sensor_2 值 ('2021-01-01 00:00:00.000', 1.52), ('2021-01-01 00:00:00.001', 1.54), ('2021-01-01 00:00:00.002', 1.42) , ('2021-01-01 00:00:00.003', 1.54), ('2021-01-01 00:00:00.004', 1.42), ('2021-01-01 00:00:00.005', 1.52 );

【问题讨论】:

请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

when 始终为 '2021-01-01 00:00:00' 哪些行是连续的?

我改变了时间。

CREATE TABLE sensor_2 ( when DateTime64, value Float32 ) ENGINE=MergeTree PARTITION BY toYYYYMM(when) ORDER BY (when);

INSERT INTO sensor_2 Values ('2021-01-01 00:00:00', 1.52), ('2021-01-01 00:00:01', 1.54), ('2021-01-01 00:00:02', 1.42), ('2021-01-01 00:00:03', 1.54), ('2021-01-01 00:00:04', 1.42), ('2021-01-01 00:00:05', 1.52);

SELECT
    *,
    avg(value) OVER (ORDER BY when ASC Rows BETWEEN 1 PRECEDING AND CURRENT ROW) AS sliding_avg2
FROM sensor_2
┌────────────────────when─┬─value─┬───────sliding_avg2─┐
│ 2021-01-01 00:00:00.000 │  1.52 │ 1.5199999809265137 │
│ 2021-01-01 00:00:01.000 │  1.54 │ 1.5299999713897705 │
│ 2021-01-01 00:00:02.000 │  1.42 │ 1.4799999594688416 │
│ 2021-01-01 00:00:03.000 │  1.54 │ 1.4799999594688416 │
│ 2021-01-01 00:00:04.000 │  1.42 │ 1.4799999594688416 │
│ 2021-01-01 00:00:05.000 │  1.52 │ 1.4699999690055847 │
└─────────────────────────┴───────┴────────────────────┘

SELECT
    when,
    value,
    (value + neighbor(value, -1)) / 2 AS sliding_avg2
FROM
(
    SELECT *
    FROM sensor_2
    ORDER BY when ASC
)

┌────────────────────when─┬─value─┬───────sliding_avg2─┐
│ 2021-01-01 00:00:00.000 │  1.52 │ 0.7599999904632568 │
│ 2021-01-01 00:00:01.000 │  1.54 │ 1.5299999713897705 │
│ 2021-01-01 00:00:02.000 │  1.42 │ 1.4799999594688416 │
│ 2021-01-01 00:00:03.000 │  1.54 │ 1.4799999594688416 │
│ 2021-01-01 00:00:04.000 │  1.42 │ 1.4799999594688416 │
│ 2021-01-01 00:00:05.000 │  1.52 │ 1.4699999690055847 │
└─────────────────────────┴───────┴────────────────────┘

【讨论】:

是的,时间基本一致。传感器输出为 1KHz,因此每秒有一千个点。我需要按(i)连续 4 行(ii)连续 24 行(iii)连续 1440 行对数据进行分组。如何 GROUP BY N 连续行? 就用我的例子? 哪里指定连续行数? 你给我的例子并没有解决我的挑战。我想按 N 连续行对数据进行分组,然后计算其平均值。如果 N = 2,那么从 6 行开始,最终表应该有 3 行。即 6/N 你的例子没有帮助。我几乎什么都不懂。提供正常输入和所需输出。

以上是关于Clickhouse:如何获得 2 个连续行的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个变量,该变量是给定时间范围内连续行的总和并按 id

差距和岛屿 - 如何按 ID 对每组连续行求和

clickhouse 计算平均值

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

处理连续行计算

MySQL 在特定条件下返回最新和最长的连续行