计算每列上有多少百分比的值为空

时间:2014-11-19 13:43:11

标签: sql postgresql information-schema

有没有办法通过information_schema或其他方式计算一个表(或一组表,更好)的每列中有多少百分比是NULL

3 个答案:

答案 0 :(得分:2)

Your query有很多问题,最重要的是你没有转义标识符(在最坏的情况下可能导致异常或SQL注入攻击)并且你没有考虑模式。 改为使用:

SELECT 'SELECT ' || string_agg(concat('round(100 - 100 * count(', col
                  , ') / count(*)::numeric, 2) AS ', col_pct), E'\n     , ')
    || E'\nFROM   ' ||  tbl
FROM (
   SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) AS tbl
        , quote_ident(column_name) AS col
        , quote_ident(column_name || '_pct') AS col_pct
   FROM   information_schema.columns
   WHERE  table_name = 'my_table_name'
   ORDER  BY ordinal_position
   ) sub
GROUP  BY tbl;

生成如下查询:

SELECT round(100 - 100 * count(id) / count(*)::numeric, 2) AS id_pct
     , round(100 - 100 * count(day) / count(*)::numeric, 2) AS day_pct
     , round(100 - 100 * count("oDd X") / count(*)::numeric, 2) AS "oDd X_pct"
FROM   public.my_table_name;

关于dba.SE的详细相关答案有更多细节:

答案 1 :(得分:0)

认为没有内置功能。你可以做这个自我

只需遍历表中的每一列,并计算所有行的计数count()和列为null的行的count()。

对于一个表的一个查询,可以并优化它。

答案 2 :(得分:0)

好的,我玩了一会儿并提出了一个返回查询的查询 - 如果您使用LIKE 'my_table%'而不是= 'my_table_name'则会进行查询:

SELECT 'select '|| string_agg('(count(*)::real-count('||column_name||')::real)/count(*)::real as '||column_name||'_percentage ', ', ') || 'from ' || table_name
FROM information_schema.columns
WHERE table_name LIKE 'my_table_name'
GROUP BY table_name

它返回一个可立即运行的SQL查询,如:

"SELECT (count(*)::real-count(id)::real)/count(*)::real AS id_percentage , (count(*)::real-count(value)::real)/count(*)::real AS value_percentage FROM my_table_name"
id_percentage;value_percentage
0;0.0177515

(对于可读性,上限并没有完全正确。)