Получить лучшие страны патентов, коды в общедоступном наборе данных BQ - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь использовать аналитическую функцию, чтобы получить две верхние страны с патентными заявками, и в этих двух верхних странах получить две лучшие формы заявок. Например, ответ будет выглядеть примерно так:

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

1 Ответ

2 голосов
/ 24 мая 2019

Ниже для BigQuery Standard SQL

#standardSQL
WITH A AS (
  SELECT country_code
  FROM `patents-public-data.patents.publications`
  GROUP BY country_code
  ORDER BY COUNT(1) DESC
  LIMIT 2
), B AS (
  SELECT
    country_code,
    application_kind,
    COUNT(1) application_kind_count
  FROM `patents-public-data.patents.publications`
  WHERE country_code IN (SELECT country_code FROM A)
  GROUP BY country_code, application_kind
), C AS (
  SELECT
    country_code,
    application_kind,
    application_kind_count,
    DENSE_RANK() OVER(PARTITION BY country_code ORDER BY application_kind_count DESC) AS application_kind_rank
  FROM B
)
SELECT
  country_code,
  application_kind,
  application_kind_count
FROM C
WHERE application_kind_rank <= 2  

с результатом

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...