[英]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.