从bigquery数组获取长度为3的所有窗口

时间:2018-11-06 20:59:45

标签: google-bigquery

如果我有一个像这样的表:

value1 | value2 | value3
-------|--------|-------
  a    |   1    |.  z
  a    |   2    |.  x
  a.   |.  3    |.  z
  a.   |.  4    |.  x
  b.   |.  1    |.  x
  b.   |.  2    |.  z
  c.   |.  1    |.  z
  c.   |.  2    |.  x
  c.   |.  3    |.  z

我想从中获得三个值的所有有序窗口,例如:

(a, [(1, z), (2, x), (3, z)]), (a, [(2, z), (3, z), (4, x)]), (c, [(1, z), (2, x), (3, z)])

使用BigQuery,我该如何在多个唯一的value1键之间进行汇总,并确保它们按value2排序。

所以我的查询将类似于:

SELECT
    val1,
    ARRAY_AGG(STRUCT(value2, value3)) vals
FROM my_table

然后我需要一个查询窗口以获取所有三个值的分组。我以为我可以使用ROW_NUMBER()之类的东西,但是我不确定是否有解决此问题的简单方法。

1 个答案:

答案 0 :(得分:2)

以下是用于BigQuery Standrad SQL

版本1:

#standardSQL
SELECT
  value1, [arr[OFFSET(pos)], arr[OFFSET(pos + 1)], arr[OFFSET(pos + 2)]] arr
FROM (
  SELECT value1, ARRAY_AGG(STRUCT(value2, value3)) arr
  FROM `project.dataset.table`
  GROUP BY value1
  HAVING ARRAY_LENGTH(arr) > 2
), UNNEST(GENERATE_ARRAY(0, ARRAY_LENGTH(arr) - 3)) pos

版本2:

#standardSQL
SELECT
  value1, ARRAY(SELECT s FROM UNNEST(arr) s WITH OFFSET ord WHERE ord >= pos ORDER BY ord LIMIT 3) arr
FROM (
  SELECT value1, ARRAY_AGG(STRUCT(value2, value3)) arr
  FROM `project.dataset.table`
  GROUP BY value1
  HAVING ARRAY_LENGTH(arr) > 2
), UNNEST(GENERATE_ARRAY(0, ARRAY_LENGTH(arr) - 3)) pos  

如果使用下面的CTE将这两个版本应用于您的问题的虚拟数据

WITH `project.dataset.table` AS (
  SELECT 'a' value1, 1 value2, 'z' value3 UNION ALL
  SELECT 'a', 2, 'x' UNION ALL
  SELECT 'a', 3, 'z' UNION ALL
  SELECT 'a', 4, 'x' UNION ALL
  SELECT 'b', 1, 'x' UNION ALL
  SELECT 'b', 2, 'z' UNION ALL
  SELECT 'c', 1, 'z' UNION ALL
  SELECT 'c', 2, 'x' UNION ALL
  SELECT 'c', 3, 'z' 
)

结果是

Row value1  arr.value2  arr.value3   
1   a       1           z    
            2           x    
            3           z    
2   a       2           x    
            3           z    
            4           x    
3   c       1           z    
            2           x    
            3           z      

很明显,您可以使用所需的任何方式打包输出