Snowflake cloud data platform 所有列中的雪花计数为空
我见过一些这样的问题-Snowflake cloud data platform 所有列中的雪花计数为空,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我见过一些这样的问题- 但是,真的没有一种方法可以计算一个表中超过30列的空值吗?就像我不想按名称指定它们一样?@chris您应该注意,Snowflake中的元数据类似于SQL Server。所以,您想在元数据级别了解的任何内容都已经由SQL Server从业者解决了。 请参阅此链接- 这在Oracle中是不同的,在Oracle中,元数据表给出了每列中的null数以及密度 但是,真的没有一种方法可以计算一个表中超过30列的空值吗?就像我不想用名字来指定它们一样 是的,就是这样。我不明白为什么这么
但是,真的没有一种方法可以计算一个表中超过30列的空值吗?就像我不想按名称指定它们一样?@chris您应该注意,Snowflake中的元数据类似于SQL Server。所以,您想在元数据级别了解的任何内容都已经由SQL Server从业者解决了。 请参阅此链接- 这在Oracle中是不同的,在Oracle中,元数据表给出了每列中的null数以及密度 但是,真的没有一种方法可以计算一个表中超过30列的空值吗?就像我不想用名字来指定它们一样
是的,就是这样。我不明白为什么这么难——就像熊猫身上的一条线 这里的关键点是,如果没有提供电池,那么您需要编写自己的版本。这并不像看上去那么难 假设输入表如下所示:
CREATE OR REPLACE TABLE t AS SELECT $1 AS col1, $2 AS col2, $3 AS col3, $4 AS col4
FROM VALUES (1,2,3,10),(NULL,2,3,10),(NULL,NULL,4,10),(NULL,NULL,NULL,10);
SELECT * FROM t;
/*
+------+------+------+------+
| COL1 | COL2 | COL3 | COL4 |
+------+------+------+------+
| 1 | 2 | 3 | 10 |
| NULL | 2 | 3 | 10 |
| NULL | NULL | 4 | 10 |
| NULL | NULL | NULL | 10 |
+------+------+------+------+
*/
您可能知道如何编写提供所需输出的查询,但由于问题中未提供该查询,因此我将使用自己的版本:
WITH cte AS (
SELECT
COUNT(*) AS total_rows
,total_rows - COUNT(col1) AS col1
,total_rows - COUNT(col2) AS col2
,total_rows - COUNT(col3) AS col3
,total_rows - COUNT(col4) AS col4
FROM t
)
SELECT COLUMN_NAME, NULLS_COLUMN_COUNT,SUM(NULLS_COLUMN_COUNT) OVER() AS NULLS_TOTAL_COUNT
FROM cte
UNPIVOT (NULLS_COLUMN_COUNT FOR COLUMN_NAME IN (col1,col2,col3, col4))
ORDER BY COLUMN_NAME;
/*
+-------------+--------------------+-------------------+
| COLUMN_NAME | NULLS_COLUMN_COUNT | NULLS_TOTAL_COUNT |
+-------------+--------------------+-------------------+
| COL1 | 3 | 6 |
| COL2 | 2 | 6 |
| COL3 | 1 | 6 |
| COL4 | 0 | 6 |
+-------------+--------------------+-------------------+
*/
在这里,我们可以看到查询本质上是静态的,几乎没有移动部分列\计数\列表/表\名称/列\列表:
WITH cte AS (
SELECT
COUNT(*) AS total_rows
<column_count_list>
FROM <table_name>
)
SELECT COLUMN_NAME, NULLS_COLUMN_COUNT,SUM(NULLS_COLUMN_COUNT) OVER() AS NULLS_TOTAL_COUNT
FROM cte
UNPIVOT (NULLS_COLUMN_COUNT FOR COLUMN_NAME IN (<column_list>))
ORDER BY COLUMN_NAME;
现在使用元数据和变量:
-- input
SET sch_name = 'my_schema';
SET tab_name = 't';
SELECT
LISTAGG(c.COLUMN_NAME, ', ') WITHIN GROUP(ORDER BY c.COLUMN_NAME) AS column_list
,ANY_VALUE(c.TABLE_SCHEMA || '.' || c.TABLE_NAME) AS full_table_name
,LISTAGG(REPLACE(SPACE(6) || ',total_rows - COUNT(<col_name>) AS <col_name>'
|| CHAR(13)
, '<col_name>', c.COLUMN_NAME), '')
WITHIN GROUP(ORDER BY COLUMN_NAME) AS column_count_list
,REPLACE(REPLACE(REPLACE(
'WITH cte AS (
SELECT
COUNT(*) AS total_rows
<column_count_list>
FROM <table_name>
)
SELECT COLUMN_NAME, NULLS_COLUMN_COUNT,SUM(NULLS_COLUMN_COUNT) OVER() AS NULLS_TOTAL_COUNT
FROM cte
UNPIVOT (NULLS_COLUMN_COUNT FOR COLUMN_NAME IN (<column_list>))
ORDER BY COLUMN_NAME;'
,'<column_count_list>', column_count_list)
,'<table_name>', full_table_name)
,'<column_list>', column_list) AS query_to_run
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_SCHEMA = UPPER($sch_name)
AND TABLE_NAME = UPPER($tab_name);
运行代码将生成要运行的查询:
复制输出并运行它将得到输出。如果需要,可以进一步细化此模板并使用存储过程包装,但我将其作为练习。您是说要在整个表中跨所有列计算空值,然后获取单个值吗?如果您不想通过名称指定每一列的轴或其他名称,那么可能必须为此使用UDF或存储过程。我不明白为什么这么难——就像熊猫中的一行一样?我认为在一个查询中不枚举它们是不可行的,可能是通过信息模式上的复杂嵌套查询?。但是…为什么不使用python或node动态获取所有列名并创建/运行查询?因为SQL和pandas是非常不同的工具,具有不同的优缺点;另外,你可能会发现在pandas中很容易,因为你已经知道pandas中的解决方案,而在Snowflake中很难,因为你还不知道如何编写SP来实现你想要的。我该如何编写SP?