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

BigQuery, Get array of rows number by condition in a group by

给定一个 table

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

我需要一个按条件 'yes' 的第 1 列的行数列表,按 as

   id arr
    1 [2,3]
    2 [2]

谢谢

以下是 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。但这可以是日期或时间戳等。

显然,正式地,你可以像下面这样在没有额外的 col 的情况下做你的问题

#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   

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

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