BigQuery,按组中的条件获取行数数组

时间:2019-09-05 07:26:53

标签: google-bigquery bigquery-standard-sql

提供表格

POST test_v2/_update/Z_nM_2wBjkGOA-r6ArOb
{
  "script": {
    "lang": "painless",
    "inline": "if(!ctx._source.containsKey('nested_field')){ctx._source['nested_field']=[]}ctx._source.nested_field.add(params.object)",
    "params": {
      "object": {
        "model": "tata nano",
        "value": "2"
      }
    }
  }
}

我需要按条件“是”在一个列中以as为列的第1列的行数列表

id column1 timestamp
1  no
1  yes
1  yes
2  no
2  yes
2  no

谢谢

1 个答案:

答案 0 :(得分:1)

以下BigQuery标准SQL示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 1 pos, 'no' col1 UNION ALL
  SELECT 1, 2, 'yes' UNION ALL
  SELECT 1, 3, 'yes' UNION ALL
  SELECT 2, 4, 'no' UNION ALL
  SELECT 2, 5, 'yes' UNION ALL
  SELECT 2, 6, 'no' 
)
SELECT id, ARRAY_AGG(num ORDER BY num) arr
FROM (
  SELECT id, col1, ROW_NUMBER() OVER(PARTITION BY id ORDER BY pos) num
  FROM `project.dataset.table`
)
WHERE col1 = 'yes'
GROUP BY id   

有输出

Row id  arr  
1   1   2    
        3    
2   2   2     

注意:您必须有一些额外的列来标识行的顺序,这样输出才是确定的-在这种情况下,我添加了列pos。但这可以是日期或时间戳等。

很显然,您可以按照以下方式正式进行以下操作,而不会出现问题中的多余空格

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 'no' col1 UNION ALL
  SELECT 1, 'yes' UNION ALL
  SELECT 1, 'yes' UNION ALL
  SELECT 2, 'no' UNION ALL
  SELECT 2, 'yes' UNION ALL
  SELECT 2, 'no' 
)
SELECT id, ARRAY_AGG(num ORDER BY num) arr
FROM (
  SELECT id, col1, ROW_NUMBER() OVER(PARTITION BY id) num
  FROM `project.dataset.table`
)
WHERE col1 = 'yes'
GROUP BY id   

但是输出将不确定,因此没有实际价值

注意:在上面的示例中,您仍将具有与第一个查询相同的输出,但是在现实生活中,如果输出是随机的,则输出将是随机的-除非与在第一个查询中一样,您需要确定顺序