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

Clickhouse中是否有函数为表列生成交替+1/-1?适配CollapsingMergeTree

用ClickHouse CollapsingMergeTree替代ROW_NUMBER()生成+1/-1标识列

针对你在客户数据湖中保留每个客户最新记录的需求,结合CollapsingMergeTree自动合并新旧版本的特性,可以通过窗口函数判断生成交替的+1/-1标识列,替代原有的ROW_NUMBER()筛选逻辑。

修改后的物化视图代码

CREATE MATERIALIZED VIEW crm_customers_mv
TO idl_db.crm_customers (
    -- 需匹配目标表结构,必须包含_sign列
    crm_customer_id UInt64,
    -- 其他业务字段...
    _ingestion_ts DateTime,
    _sign Int8
)
ENGINE = CollapsingMergeTree(_sign)
ORDER BY crm_customer_id -- 排序键包含客户ID,确保同客户记录能被归为一组合并
{replica} -- 保留原有副本配置
AS
SELECT
    *,
    -- 按 ingestion_ts倒序排序,最新记录标记+1,所有旧记录标记-1
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY crm_customer_id ORDER BY `_ingestion_ts` DESC) = 1 THEN 1 ELSE -1 END AS _sign
FROM idl_db.crm_customers_data_lake

关键逻辑说明

  1. _sign列生成:通过ROW_NUMBER()按客户ID分区、 ingestion_ts倒序排序后,第一条(最新)记录赋值1,其余旧记录统一赋值-1。CollapsingMergeTree会自动将同主键下的-1记录与之前的+1记录抵消,最终仅保留最新的+1记录。
  2. 目标表配置:必须使用CollapsingMergeTree引擎,并指定_sign作为合并标识列;排序键需包含crm_customer_id,确保同一客户的所有记录会被纳入同一合并组。
  3. 与原实现的差异:原代码是直接过滤出最新记录写入视图,新方案则是将所有记录带标识写入,由CollapsingMergeTree在后台自动完成合并清理,更适配数据湖持续写入、频繁更新的场景。

注意事项

  • 目标表idl_db.crm_customers的结构必须包含_sign Int8字段,且其他字段需与源表crm_customers_data_lake匹配。
  • 如果需要更精准的合并顺序控制,可以在排序键中加入_ingestion_ts,确保合并时严格按时间顺序处理新旧版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:08:24