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

如何编写SQL查询全表所有列中出现次数最多的2个数值

全数值类型数据表全列高频Top2值高效实现思路

场景1:单库中小规模表(百万级以内,MySQL/PostgreSQL等关系型数据库)

  • 核心思路:将多列数值合并为单列统一聚合,仅需扫描一次全表,避免多列分别统计再合并的冗余计算
  • 参考SQL实现:
SELECT val, COUNT(*) AS freq
FROM (
    SELECT col1 AS val FROM your_table WHERE col1 IS NOT NULL
    UNION ALL
    SELECT col2 AS val FROM your_table WHERE col2 IS NOT NULL
    -- 依次补充其余所有数值列
    SELECT colN AS val FROM your_table WHERE colN IS NOT NULL
) AS all_val_list
GROUP BY val
ORDER BY freq DESC
LIMIT 2;
  • 优化点:如果表存在覆盖所有统计列的联合索引,可直接走索引扫描无需回表,性能可再提升50%以上。

场景2:超大规模表/分布式数仓表(亿级以上,Spark/Hive等)

  • 核心思路:分阶段聚合压缩数据量,大幅降低全局shuffle开销
  • 实现步骤:
    • 第一步局部聚合:每列单独统计各自的*前35个高频值*,全局Top2必然包含在各列的局部高频结果中,取35是预留冗余避免边界统计误差
    • 第二步全局聚合:把所有列的局部高频结果合并,统一统计全局频次后取Top2即可
  • 性能优势:无需传输全表所有数值,仅需传输每列的少量局部高频值,数据压缩比可达百倍以上,分布式场景下性能提升尤为明显。

场景3:内存DataFrame处理(Python Pandas等)

  • 核心思路:利用向量化操作替代遍历,性能远高于逐列统计再合并
  • 参考代码实现:
import pandas as pd
# 直接把所有列堆叠为单列后统计高频值
top2_result = pd.concat([df[col] for col in df.columns]).value_counts().head(2)
  • 优化点:如果内存放不下全表,可分块读取逐块统计局部高频值,最后合并全局结果即可避免OOM。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:15:03