В большинстве случаев использования [больших данных] использование ROW_NUMBER () не подходит, так как заканчивается ошибкой превышения ресурса.Это связано с тем, что требуется, чтобы все точки одной и той же группы присутствовали в одном и том же / одном узле, что в случае перекоса данных приводит к вышеупомянутой ошибке в BigQuery
Опция 1
Одним из обычных способов решения этой проблемы является использование функции ARRAY_AGG (), как показано ниже в следующем примере
#standardSQL
SELECT type, total FROM (
SELECT type, ARRAY_AGG(total ORDER BY total DESC LIMIT 3) arr
FROM `project.dataset.table` GROUP BY type
), UNNEST(arr) total
Если выполнить выше пример данных из вашего вопроса
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'A' type, 100 total UNION ALL
SELECT 'A', 123 UNION ALL
SELECT 'A', 154 UNION ALL
SELECT 'A', 50 UNION ALL
SELECT 'A', 54 UNION ALL
SELECT 'B', 200 UNION ALL
SELECT 'B', 166 UNION ALL
SELECT 'B', 423 UNION ALL
SELECT 'B', 342 UNION ALL
SELECT 'B', 213 UNION ALL
SELECT 'C', 520 UNION ALL
SELECT 'C', 130 UNION ALL
SELECT 'C', 234 UNION ALL
SELECT 'C', 512
)
SELECT type, total FROM (
SELECT type, ARRAY_AGG(total ORDER BY total DESC LIMIT 3) arr
FROM `project.dataset.table` GROUP BY type
), UNNEST(arr) total
-- ORDER BY type
Вы получите ожидаемый результат в виде
Row type total
1 A 154
2 A 123
3 A 100
4 B 423
5 B 342
6 B 213
7 C 520
8 C 512
9 C 234
Вариант 2
Но есть еще один интересный вариант для действительно больших данных - использовать функцию APPROX_TOP_SUM () какв приведенном ниже примере
#standardSQL
SELECT type, value AS total FROM (
SELECT type, APPROX_TOP_SUM(total, total, 3) arr
FROM `project.dataset.table` GROUP BY type
), UNNEST(arr)
, очевидно, с тем же выводом, что и выше для данных выборки