如何从ClickHouse数组类型列提取全局去重值并统计数量
解决ClickHouse数组列全局元素去重及统计问题
1. 提取全局去重的数组元素
使用arrayJoin将数组列拆分为单行元素,再通过DISTINCT实现全局去重,查询语句如下:
SELECT DISTINCT arrayJoin(errors.message_grouping_fingerprint) AS fingerprint FROM views WHERE session_date >= toDate('2022-07-21') AND session_date < toDate('2022-07-22') AND notEmpty(errors.message) = 1 AND project_id = 162 SETTINGS distributed_group_by_no_merge=0
执行后将得到目标结果:
-8964675922652096680 -827009490898812590 -1660275624223727714 1852265010681444046 -2552644061611887546 -7142229185866234523
2. 统计去重后的元素总数
直接通过COUNT(DISTINCT ...)统计全局唯一元素的数量,查询语句如下:
SELECT COUNT(DISTINCT arrayJoin(errors.message_grouping_fingerprint)) AS unique_fingerprint_count FROM views WHERE session_date >= toDate('2022-07-21') AND session_date < toDate('2022-07-22') AND notEmpty(errors.message) = 1 AND project_id = 162 SETTINGS distributed_group_by_no_merge=0
执行后将返回预期结果:6
逻辑说明
arrayJoin函数会把数组列中的每个元素拆分成独立的行,让原本嵌套在数组内的元素可以被全局去重和统计。原查询仅对整个数组结构做DISTINCT,无法处理数组内部及跨数组的重复元素,而该逻辑正好解决了这个问题。
内容的提问来源于stack exchange,提问作者Luis Urea
相关产品推荐
相关产品推荐

