Я пытаюсь использовать аналитическую функцию, чтобы получить две верхние страны с патентными заявками, и в этих двух верхних странах получить две лучшие формы заявок. Например, ответ будет выглядеть примерно так:
country - code
US P
US A
GB X
GB P
Вот запрос, который я использую, чтобы получить это:
SELECT
country_code,
MIN(count_country_code) count_country_code,
application_kind
FROM (
WITH
A AS (
SELECT
country_code,
COUNT(country_code) OVER (PARTITION BY country_code) AS count_country_code,
application_kind
FROM
`patents-public-data.patents.publications`),
B AS (
SELECT
country_code,
count_country_code,
DENSE_RANK() OVER(ORDER BY count_country_code DESC) AS country_code_num,
application_kind,
DENSE_RANK() OVER(PARTITION BY country_code ORDER BY count_country_code DESC) AS application_kind_num
FROM
A)
SELECT
country_code,
count_country_code,
application_kind
FROM
B
WHERE
country_code_num <= 2
AND application_kind_num <= 2) x
GROUP BY
country_code,
application_kind
ORDER BY
count_country_code DESC
Однако, к сожалению, я получаю сообщение об ошибке «Превышена память» из-за перезаписи / порядка / раздела. Вот сообщение:
Ресурсы превышены во время выполнения запроса: запрос не может быть выполнен в выделенной памяти. Пиковое использование: 112% от лимита. Главный потребитель (и) памяти: операции сортировки, используемые для аналитических предложений OVER (): 98%, другие / неназначенные: 2%
Как бы я мог выполнить вышеуказанный запрос (или другие подобные запросы), не сталкиваясь с этими ошибками памяти? Это можно проверить в общедоступном наборе данных здесь .
Один грубый способ сделать это (который работает только в том случае, если поля имеют полунизкую мощность), состоит в том, чтобы сделать это в качестве простой операции агрегирования и отсортировать результаты в памяти вне БД. Например:
![enter image description here](https://i.stack.imgur.com/r1WNt.png)