您必须有一些可用于定义订单的字段。
在下面的示例中,我假设它是id 字段
下面应该做你所期望的
#standardSQL
SELECT
CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1,
CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2
FROM (
SELECT
id, field1, field2,
COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp
FROM yourTable
) t
GROUP BY grp
ORDER BY MIN(id)
您可以使用以下来自您问题的虚拟数据进行测试/尝试
#standardSQL
WITH yourTable AS (
SELECT 1 AS id, 'val1' AS field1, 100 AS field2 UNION ALL
SELECT 2 AS id, 'val2' AS field1, 110 AS field2 UNION ALL
SELECT 3 AS id, 'val3' AS field1, 100 AS field2 UNION ALL
SELECT 4 AS id, 'val4' AS field1, 110 AS field2 UNION ALL
SELECT 5 AS id, 'val3' AS field1, 130 AS field2 UNION ALL
SELECT 6 AS id, 'val3' AS field1, 140 AS field2 UNION ALL
SELECT 7 AS id, 'val1' AS field1, 100 AS field2
)
SELECT
CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1,
CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2
FROM (
SELECT
id, field1, field2,
COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp
FROM yourTable
)
GROUP BY grp
ORDER BY MIN(id)
输出是
field1 field2
------ ------
(val1,val2) (100,110)
(val3,val4,val3,val3) (100,110,130,140)
(val1) (100)
想知道这是否可能(不使用订单列)?
如果您的表中确实只有这两个字段 - 您很可能不走运,需要重新访问使用用于排序的附加字段填充此表的逻辑(作为时间线)
作为最后的手段 - 您可以尝试下面的示例,其中此类列是即时生成的 - 但请理解,绝对不能保证获得您期望的订单
#standardSQL
WITH yourTable AS (
SELECT 'val1' AS field1, 100 AS field2 UNION ALL
SELECT 'val2' AS field1, 110 AS field2 UNION ALL
SELECT 'val3' AS field1, 100 AS field2 UNION ALL
SELECT 'val4' AS field1, 110 AS field2 UNION ALL
SELECT 'val3' AS field1, 130 AS field2 UNION ALL
SELECT 'val3' AS field1, 140 AS field2 UNION ALL
SELECT 'val1' AS field1, 100 AS field2
),
tempTable AS (
SELECT field1, field2, ROW_NUMBER() OVER() AS id
FROM yourTable
)
SELECT
CONCAT('(',STRING_AGG(field1 ORDER BY id), ')') AS field1,
CONCAT('(',STRING_AGG(CAST(field2 AS STRING) ORDER BY id), ')') AS field2
FROM (
SELECT
id, field1, field2,
COUNTIF(field2 = 100) OVER (ORDER BY id) AS grp
FROM tempTable
)
GROUP BY grp
ORDER BY MIN(id)
输出是相同的 - 但同样 - 不能保证!
field1 field2
------ ------
(val1,val2) (100,110)
(val3,val4,val3,val3) (100,110,130,140)
(val1) (100)