求通用Presto SQL查询语句:计算表所有字段的填充率
通用Presto SQL查询:计算任意表所有字段的填充率
核心查询语句
以下查询无需手动指定列名,可自动适配任意列数的表,替换your_table为目标表名即可使用:
WITH total_rows AS ( SELECT COUNT(*) AS total FROM your_table ) SELECT column_name, COUNT(CASE WHEN value IS NOT NULL THEN 1 END) / total AS fill_rate FROM your_table, UNNEST(MAP_ENTRIES(JSON_PARSE(TO_JSON(your_table)))) AS t(column_name, value), total_rows GROUP BY column_name, total ORDER BY column_name;
逻辑拆解
- 总行数统计:通过
total_rows公共表表达式(CTE)先计算表的总行数,作为填充率计算的分母 - 行转键值对:用
TO_JSON把每行数据转为JSON对象,再通过JSON_PARSE和MAP_ENTRIES将其拆解为「列名-字段值」的键值对数组 - 展开聚合:用
UNNEST把键值对数组展开为行数据,最后按列名聚合,统计非空值数量并除以总行数得到填充率
示例验证
针对你提到的3行4列测试表,执行查询后会输出符合预期的结果:
| column_name | fill_rate |
|---|---|
| A | 0.666... |
| B | 0.333... |
| C | 0.333... |
| D | 1.0 |
如果需要保留两位小数,可修改填充率计算逻辑:
ROUND(COUNT(CASE WHEN value IS NOT NULL THEN 1 END) / total, 2) AS fill_rate
额外提示
- 若需过滤特定行(如分区数据),直接在
your_table后添加WHERE条件即可 - 支持所有数据类型列,包括数组、结构体等复杂类型,非空值都会被统计
- 大表场景下,建议添加分区过滤或采样逻辑提升查询效率
内容的提问来源于stack exchange,提问作者aju_dev
相关产品推荐
相关产品推荐

