【问题标题】:BigQuery : is it possible to iterate over an array?BigQuery:是否可以迭代数组?
【发布时间】:2020-11-13 00:02:07
【问题描述】:

是否可以在标准 sql 中迭代 bigquery 中的数组?

基本上声明一个表示表字段的字符串数组。例如:

DECLARE FIELDS_TO_CHECK ARRAY<STRING>;
SET FIELDS_TO_CHECK =  ['field1', 'field2', 'field3' ];

然后在这个数组上进行迭代,以创建请求在这个字段上获得非空值的百分比:

select count(FIELD) / count(*) from 
'table_name'`

【问题讨论】:

  • 如果您将列名存储为字符串,那么您需要在应用程序级别执行此操作。

标签: sql google-cloud-platform google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL 的示例
我在这里使用 TEMP TABLE `table_name` 来用一些简单的虚拟数据来模拟您的数据,但您可以删除该 CREATE 语句并使用您自己的表

#standardSQL
DECLARE FIELDS_TO_CHECK ARRAY<STRING>;
DECLARE i INT64 DEFAULT 0;

CREATE TEMP TABLE `table_name` AS 
  SELECT 1 field1, NULL field2, 3 field3, 4 field4, 5 field5 UNION ALL
  SELECT NULL, NULL, 3, NULL, 5 UNION ALL
  SELECT 1, NULL, 3, 4, 6;

CREATE TEMP TABLE result(field STRING, percentage FLOAT64);  
  
SET FIELDS_TO_CHECK =  ['field1', 'field2', 'field3' ];

LOOP
  SET i = i + 1;
  IF i > ARRAY_LENGTH(FIELDS_TO_CHECK) THEN 
    LEAVE; 
  END IF;
  EXECUTE IMMEDIATE '''
    INSERT result
    SELECT "''' || FIELDS_TO_CHECK[ORDINAL(i)] || '''", COUNT(''' || FIELDS_TO_CHECK[ORDINAL(i)] || ''') / COUNT(*) FROM `table_name`
  ''';

END LOOP; 

SELECT * FROM result;   

上面的例子返回下面的输出

Row field   percentage   
1   field2  0.0  
2   field1  0.66666666666666663  
3   field3  1.0  

【讨论】:

    【解决方案2】:

    您可以使用 for in 循环遍历数组元素。
    关键是使用 UNNEST 来获取数组中的元素。
    这句话会比使用带有索引移动的循环更具声明性。

    DECLARE FIELDS_TO_CHECK ARRAY<STRING>;
    SET FIELDS_TO_CHECK =  ['field1', 'field2', 'field3' ];
    
    FOR field IN
      (SELECT * from UNNEST(FIELDS_TO_CHECK))
    DO
      # do whatever you want with field
    END FOR
    

    【讨论】:

    • 当我输入“SELECT field;”在 do 语句中,它首先打印整个数组,然后一次打印一个元素。我怎样才能只得到奇异的元素?
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多