You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ClickHouse时序数据中去除连续重复值的行?

在ClickHouse中处理时序数据:去除连续相同值的行

针对你的100亿级时序数据需求,ClickHouse完全可以实现去除连续相同值的行,以下是两种可行方案,按性能优先级排序:

一、预处理存储(最优方案,适合超大规模数据)

由于你的数据中90%是连续重复值,实时查询会带来不必要的计算开销,通过物化视图提前存储去重结果是最优选择,后续查询直接读取预处理后的数据,性能提升显著。

1. 创建原始时序表(若未创建)

先定义适配时序数据的存储结构,建议按时间分区、key+timestamp排序来优化性能:

CREATE TABLE time_series_data
(
    key UInt64,
    timestamp UInt64,
    value UInt64
)
ENGINE = MergeTree()
PARTITION BY toDate(timestamp) -- 根据你的时间粒度调整分区规则
ORDER BY (key, timestamp); -- 按分组键和时间排序,加速窗口函数计算

2. 创建自动去重的物化视图

物化视图会监听原始表的写入操作,自动计算并存储去除连续相同值后的结果:

CREATE MATERIALIZED VIEW mv_time_series_dedup
ENGINE = MergeTree()
ORDER BY (key, timestamp)
AS
SELECT key, timestamp, value
FROM (
    SELECT 
        key,
        timestamp,
        value,
        -- 按key分组、时间排序,取上一行的value
        LAG(value) OVER (PARTITION BY key ORDER BY timestamp) AS prev_value
    FROM time_series_data
)
-- 保留第一行,或与上一行value不同的行
WHERE prev_value IS NULL OR value != prev_value;

3. 高效查询结果

后续直接查询物化视图即可得到目标数据:

SELECT * FROM mv_time_series_dedup ORDER BY key, timestamp;

批量导入优化

如果是批量导入原始数据,可先暂停物化视图更新,避免导入时的性能损耗:

-- 暂停物化视图更新
ALTER MATERIALIZED VIEW mv_time_series_dedup STOP;
-- 执行批量数据导入
-- 恢复物化视图更新
ALTER MATERIALIZED VIEW mv_time_series_dedup START;

二、查询时实时去重(适合临时查询场景)

如果只是临时需求,不需要长期存储去重结果,可直接用窗口函数实时计算:

SELECT key, timestamp, value
FROM (
    SELECT 
        key,
        timestamp,
        value,
        LAG(value) OVER (PARTITION BY key ORDER BY timestamp) AS prev_value
    FROM time_series_data
)
WHERE prev_value IS NULL OR value != prev_value
ORDER BY key, timestamp;

这个查询会按key分组、timestamp排序,只保留每个连续相同值段的起始行,完全匹配你的示例需求。

内容的提问来源于stack exchange,提问作者SCcagg5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:05:03