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?