繁体   English   中英

计算表中每一列的 null 值的数量

[英]Count number of null values for every column on a table

我想为表中的每一列计算 null 行的百分比。 对于一列,我使用的是:

SELECT ((SELECT COUNT(Col1)
FROM Table1)
/        
(SELECT COUNT(*)
FROM Table1)) AS Table1Stats 

效果很好而且速度很快。 但是,我想对表的所有 ~50 列执行此操作,并且我的环境不允许我使用动态 SQL。

有什么建议吗? 我正在使用雪花连接到 AWS,但作为最终用户,我使用的是雪花浏览器界面。

您可以将其组合为:

SELECT COUNT(Col1) * 1.0 / COUNT(*)
FROM Table1;

或者,如果您愿意:

SELECT AVG( (Col1 IS NOT NULL)::INT )
FROM Table1;

您可以混合使用object_construct()flatten()将列名移动到行中。 然后对缺失的值进行数学运算:

create or replace temp table many_cols as
select 1 a, 2 b, 3 c, 4 d
union all select 1, null, 3, 4
union all select 8, 8, null, null
union all select 8, 8, 7, null
union all select null, null, null, null;

select key column_name
  , 1-count(*)/(select count(*) from many_cols) ratio_null
from (
    select object_construct(a.*) x
    from many_cols a
), lateral flatten(x)
group by key
;

在此处输入图像描述

如果您不介意复制文本并在完成后运行它,您可以使用 SQL 生成器来执行此操作。

-- SQL generator option:
select 'select' || listagg(' ((select count(' || COLUMN_NAME || ') from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF10000"."ORDERS") / ' || 
       '(select count(*) from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF10000"."ORDERS")) as ' || COLUMN_NAME, ',') as SQL_STATEMENT
from "SNOWFLAKE_SAMPLE_DATA"."INFORMATION_SCHEMA"."COLUMNS" 
where TABLE_CATALOG = 'SNOWFLAKE_SAMPLE_DATA' and TABLE_SCHEMA = 'TPCH_SF10000' and TABLE_NAME = 'ORDERS'
;

如果由于需要编写脚本而无法复制和粘贴,则可以在我编写的存储过程中使用 SQL 生成器的结果来执行单行动态 SQL:

call run_dynamic_sql(

select 'select' || listagg(' ((select count(' || COLUMN_NAME || ') from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF10000"."ORDERS") / ' || 
       '(select count(*) from "SNOWFLAKE_SAMPLE_DATA"."TPCH_SF10000"."ORDERS")) as ' || COLUMN_NAME, ',') as SQL_STATEMENT
from "SNOWFLAKE_SAMPLE_DATA"."INFORMATION_SCHEMA"."COLUMNS" 
where TABLE_CATALOG = 'SNOWFLAKE_SAMPLE_DATA' and TABLE_SCHEMA = 'TPCH_SF10000' and TABLE_NAME = 'ORDERS'

);

如果你想要存储过程,在它发布在 Snowflake 的博客上之前,它可以在这里找到: https://snowflake.pavlik.us/index.php/2021/01/22/running-dynamic-sql-in-snowflake/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM