Ниже для 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
Очевидно, вы можете упаковать вывод любым удобным вам способом