PostgreSQL统计表各列非空值占比,筛选全填充列
解决PostgreSQL多列非空占比统计问题
面对800+列的表,手动编写每列的统计语句完全不现实,用动态SQL自动生成统计逻辑是最高效的方案:
方式1:生成所有列的非空占比统计语句
执行以下SQL,会输出一条可直接运行的统计语句:
SELECT 'SELECT ' || string_agg( format('COUNT(%I)::FLOAT / COUNT(*) AS %I_nonnull_ratio', column_name, column_name), ', ' ) || ' FROM projectmeasures;' AS dynamic_sql FROM information_schema.columns WHERE table_name = 'projectmeasures' AND table_schema = 'public'; -- 替换为你的表所在schema,默认是public
把输出的dynamic_sql内容复制执行,就能得到每一列的非空值占比。
方式2:直接筛选100%填充的列
如果只想拿到占比为1的列名,可修改动态SQL,让结果直接返回符合条件的列:
SELECT 'SELECT unnest(ARRAY[' || string_agg( format('CASE WHEN COUNT(%I) = COUNT(*) THEN ''%I'' END', column_name, column_name), ', ' ) || ']) AS fully_populated_columns FROM projectmeasures;' AS dynamic_sql FROM information_schema.columns WHERE table_name = 'projectmeasures' AND table_schema = 'public';
执行生成的语句后,结果中的非空值就是100%填充的列(自动过滤占比不足1的列)。
关键说明
COUNT(column_name)会自动忽略NULL值,COUNT(*)统计总行数,两者比值即为非空占比- 加
::FLOAT是为了避免PostgreSQL的整数除法取整问题,确保得到精确的小数结果 - 若表不在
publicschema下,务必修改table_schema的取值
内容的提问来源于stack exchange,提问作者TheVavs
相关产品推荐
相关产品推荐

