有没有办法从 BigQuery 的表中获取所有列的不同值?

Posted

技术标签:

【中文标题】有没有办法从 BigQuery 的表中获取所有列的不同值?【英文标题】:Is there any way to obtain distinct values across all the columns from within a table in BigQuery? 【发布时间】:2020-05-19 06:10:10 【问题描述】:

我尝试使用从特定表中获取列名列表 Select column_name from projectname.tablename.INFORMATION_SCHEMA.COLUMNS where table_name = 'something'.

我不确定是否正确的方法是遍历所有列名,同时为每个列名获取不同的值,或者在 BigQuery 中是否有不同的方法可以遵循。

期望结果是:

Col1 Col2 Col3
1     4    7
2     5    8
3          9
           11

无论值的长度如何,查询都必须返回所有列的不同值。

【问题讨论】:

【参考方案1】:

不确定您的要求有多实用,但它可能适用于相对较小的表 - 所以下面是 BigQuery 标准 SQL

#standardSQL
CREATE TEMP FUNCTION DISTINCT_VALUES (arr ANY TYPE) AS (
  ARRAY(SELECT DISTINCT el FROM UNNEST(arr) AS el ORDER BY el)
);
SELECT 
  DISTINCT_VALUES(col1) col1,
  DISTINCT_VALUES(col2) col2,
  DISTINCT_VALUES(col3) col3
FROM (
  SELECT 
    ARRAY_AGG(col1) OVER() col1,
    ARRAY_AGG(col2) OVER() col2,
    ARRAY_AGG(col3) OVER() col3
  FROM `project.dataset.table`
  LIMIT 1
) t   

如果应用到您的问题中的样本数据,如下例所示

#standardSQL
CREATE TEMP FUNCTION DISTINCT_VALUES (arr ANY TYPE) AS (
  ARRAY(SELECT DISTINCT el FROM UNNEST(arr) AS el ORDER BY el)
);
WITH `project.dataset.table` AS (
  SELECT 1 col1, 4 col2, 7 col3 UNION ALL
  SELECT 2, 5, 8 UNION ALL
  SELECT 3, 4, 9 UNION ALL
  SELECT 1, 5, 11 
)
SELECT 
  DISTINCT_VALUES(col1) col1,
  DISTINCT_VALUES(col2) col2,
  DISTINCT_VALUES(col3) col3
FROM (
  SELECT 
    ARRAY_AGG(col1) OVER() col1,
    ARRAY_AGG(col2) OVER() col2,
    ARRAY_AGG(col3) OVER() col3
  FROM `project.dataset.table`
  LIMIT 1
) t    

结果是

所以,我认为更合理的方法是得到如下结果

这可以通过下面的查询来实现

#standardSQL
SELECT DISTINCT 'col1' col, col1 value FROM `project.dataset.table` UNION ALL
SELECT DISTINCT 'col2', col2 FROM `project.dataset.table` UNION ALL
SELECT DISTINCT 'col3', col3 FROM `project.dataset.table` 

如果不同的列具有不同的数据类型 - 您可以将它们转换为 STRING,如下例所示

#standardSQL
SELECT DISTINCT 'col1' col, CAST(col1 AS STRING) value FROM `project.dataset.table` UNION ALL
SELECT DISTINCT 'col2', CAST(col2 AS STRING) FROM `project.dataset.table` UNION ALL
SELECT DISTINCT 'col3', CAST(col3 AS STRING) FROM `project.dataset.table` 

最后说明:如果列数足够大,可以手动输入上述所有查询 - 您可以轻松编写脚本 - 请参阅 https://***.com/a/61716652/5221944 中的示例

【讨论】:

以上是关于有没有办法从 BigQuery 的表中获取所有列的不同值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Bigquery 中添加它们时获取列时间戳

如何在 BigQuery 上展开数组以将列添加到现有表

如何从 bigquery 中的另一个表中获取短语列表的表字段中的匹配计数?

从 SQL Server 中 4 列的表中获取每组的前 N ​​行

如何从包含日期时间列的表中获取某些行和“先前”行?

如何从具有唯一列的表中获取行,由另一列决定