跨多字段聚合数据:统计每行segment列最高频值生成FREQUENT列
假设你的表名为segment_data,以下是不同数据库环境下实现该需求的可行方案:
- 通用思路(兼容大多数支持窗口函数的数据库)
核心逻辑是先把每行的四个segment字段拆分为行级数据,按id和字段值分组统计频次后取最高值关联回原表,代码示例如下:SELECT t.id, t.segment1, t.segment2, t.segment3, t.segment4, s.val AS FREQUENT FROM segment_data t LEFT JOIN ( SELECT id, val, ROW_NUMBER() OVER(PARTITION BY id ORDER BY COUNT(*) DESC) AS rn FROM ( SELECT id, segment1 AS val FROM segment_data UNION ALL SELECT id, segment2 AS val FROM segment_data UNION ALL SELECT id, segment3 AS val FROM segment_data UNION ALL SELECT id, segment4 AS val FROM segment_data ) tmp GROUP BY id, val ) s ON t.id = s.id AND s.rn = 1; - PostgreSQL简化写法
可以直接用数组+行转列函数逐行计算,代码更简洁性能更高:SELECT *, ( SELECT val FROM UNNEST(ARRAY[segment1, segment2, segment3, segment4]) val GROUP BY val ORDER BY COUNT(*) DESC LIMIT 1 ) AS FREQUENT FROM segment_data;
注意:如果某行存在多个值出现次数相同的最高频次,上述默认取排序靠前的第一个。如需返回所有并列最高值,可将查询中的
LIMIT 1或者ROW_NUMBER()替换为RANK()等对应支持返回多条的逻辑即可。
内容的提问来源于stack exchange,提问作者Prabhakar Kumar Jha
相关产品推荐
相关产品推荐

