Как работать с коррелированными подзапросами проблем, которые ссылаются на другие таблицы, без использования Join - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь работать с общедоступным набором данных bigquery-public-data.austin_crime.crime BigQuery. Моя цель состоит в том, чтобы получить выходные данные в виде трех столбцов, которые показывают описание (преступления), их количество и район для данного конкретного описания (преступления).

Я могу получить первые два столбца с этим запросом.

  select 
    a.description, 
    count(*) as district_count
    from `bigquery-public-data.austin_crime.crime` a
  group by description order by district_count desc

и надеялся, что я смогу сделать это с помощью одного запроса, а затем я попытался это сделать, чтобы получить третий столбец, показывающий мне Верхний район для этого конкретного описания (преступления), добавив код ниже

select 
  a.description, 
  count(*) as district_count,

       (
        select district from 
        (  select 
           district, rank() over(order by COUNT(*) desc) as rank
           FROM `bigquery-public-data.austin_crime.crime` 
           where description = a.description
           group by district 
        )  where rank = 1

  ) as top_District

  from `bigquery-public-data.austin_crime.crime` a
  group by description 
  order by district_count desc

Ошибка, которую я получаю, заключается в следующем. «Коррелированные подзапросы, которые ссылаются на другие таблицы, не поддерживаются, если их нельзя декоррелировать, например, путем преобразования их в эффективное JOIN.»

Я думаю, что могу сделать это, присоединившись. Может у кого-то есть лучшее решение, возможно, сделать это, используя без объединения.

1 Ответ

2 голосов
/ 28 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT description, 
  ANY_VALUE(district_count) AS district_count, 
  STRING_AGG(district ORDER BY cnt DESC LIMIT 1) AS top_district
FROM (
  SELECT description, district,
    COUNT(1) OVER(PARTITION BY description) AS district_count,
    COUNT(1) OVER(PARTITION BY description, district) AS cnt
  FROM `bigquery-public-data.austin_crime.crime`
)
GROUP BY description
-- ORDER BY district_count DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...