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
关键逻辑说明
- _sign列生成:通过
ROW_NUMBER()按客户ID分区、 ingestion_ts倒序排序后,第一条(最新)记录赋值1,其余旧记录统一赋值-1。CollapsingMergeTree会自动将同主键下的-1记录与之前的+1记录抵消,最终仅保留最新的+1记录。 - 目标表配置:必须使用
CollapsingMergeTree引擎,并指定_sign作为合并标识列;排序键需包含crm_customer_id,确保同一客户的所有记录会被纳入同一合并组。 - 与原实现的差异:原代码是直接过滤出最新记录写入视图,新方案则是将所有记录带标识写入,由CollapsingMergeTree在后台自动完成合并清理,更适配数据湖持续写入、频繁更新的场景。
注意事项
- 目标表
idl_db.crm_customers的结构必须包含_sign Int8字段,且其他字段需与源表crm_customers_data_lake匹配。 - 如果需要更精准的合并顺序控制,可以在排序键中加入
_ingestion_ts,确保合并时严格按时间顺序处理新旧版本。
内容的提问来源于stack exchange,提问作者praj
相关产品推荐
相关产品推荐

