如果我有一个像这样的表:
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()之类的东西,但是我不确定是否有解决此问题的简单方法。
答案 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
很明显,您可以使用所需的任何方式打包输出