Ниже для BigQuery Standard SQL
#standardSQL
SELECT uniqueId, position,
FIRST_VALUE(uniqueId) OVER(PARTITION BY grp ORDER BY IF(position = 'First', 0, 1)) result
FROM (
SELECT uniqueId, position,
COUNTIF(position = 'First') OVER(ORDER BY CAST(uniqueId AS INT64)) grp
FROM `project.dataset.table`
)
Вы можете протестировать, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT '01' uniqueId, 'First' position UNION ALL
SELECT '02', 'Last ' UNION ALL
SELECT '03', 'First' UNION ALL
SELECT '04', 'Cont ' UNION ALL
SELECT '05', 'Cont ' UNION ALL
SELECT '06', 'Cont ' UNION ALL
SELECT '07', 'Cont ' UNION ALL
SELECT '08', 'Cont ' UNION ALL
SELECT '09', 'Cont ' UNION ALL
SELECT '10', 'Last ' UNION ALL
SELECT '11', 'First' UNION ALL
SELECT '12', 'Cont ' UNION ALL
SELECT '13', 'Cont ' UNION ALL
SELECT '14', 'Cont ' UNION ALL
SELECT '15', 'Last ' UNION ALL
SELECT '16', 'First' UNION ALL
SELECT '17', 'Cont ' UNION ALL
SELECT '18', 'Last '
)
SELECT uniqueId, position,
FIRST_VALUE(uniqueId) OVER(PARTITION BY grp ORDER BY IF(position = 'First', 0, 1)) result
FROM (
SELECT uniqueId, position,
COUNTIF(position = 'First') OVER(ORDER BY CAST(uniqueId AS INT64)) grp
FROM `project.dataset.table`
)
-- ORDER BY uniqueId
с результатом
Row uniqueId position result
1 01 First 01
2 02 Last 01
3 03 First 03
4 04 Cont 03
5 05 Cont 03
6 06 Cont 03
7 07 Cont 03
8 08 Cont 03
9 09 Cont 03
10 10 Last 03
11 11 First 11
12 12 Cont 11
13 13 Cont 11
14 14 Cont 11
15 15 Last 11
16 16 First 16
17 17 Cont 16
18 18 Last 16