Почему я получаю разные значения SUM при использовании OVER (PARTITION BY yearValue)? - PullRequest
1 голос
/ 08 января 2020

Желтая таблица - raw_data , а зеленая таблица - требуемый_ выход

enter image description here

Когда я использую следующий код я получаю зеленую таблицу выше

SELECT Year, Country, sum(pageViews) total_pageviews
FROM raw_data
GROUP BY Year, Country

Однако, когда я пытаюсь разделить на Year, я получаю меньшие числа.

SELECT DISTINCT Year, Country, SUM(pageViews) OVER (PARTITION BY Year) 
FROM raw_data
GROUP BY Year, Country, pageViews

Таким образом, вывод выглядит так enter image description here Есть идеи, почему это происходит при использовании PARTITION BY?

Ответы [ 5 ]

4 голосов
/ 08 января 2020

У вас есть PageViews в GROUP BY, поэтому ваш код на самом деле не агрегирует. Это root вашей проблемы.

Вместо этого вы, кажется, пытаетесь:

SELECT Year, Country, SUM(SUM(pageViews)) OVER (PARTITION BY Year) 
FROM raw_data
GROUP BY Year, Country;

Но на самом деле вам нужно простое агрегирование:

SELECT Year, Country, SUM(pageViews)
FROM raw_data
GROUP BY Year, Country;
1 голос
/ 08 января 2020

Ниже для BigQuery Standard SQL

Ваш первый запрос - самый правильный способ получить ожидаемый результат

Но, если по какой-либо причине вам нужна функция Analyti c быть вовлеченным (как в вашем втором запросе) - вы должны использовать версию ниже

#standardSQL
SELECT Year, Country, SUM(SUM(pageViews)) OVER(PARTITION BY Year, Country) total_pageviews
FROM `project.dataset.raw_data`
GROUP BY Year, Country
1 голос
/ 08 января 2020

Я не уверен, что это на самом деле возможно вне использования подзапроса. partition by не меняет количество возвращаемых строк, как group by, и поэтому ваш код по-прежнему возвращает строку для каждой записи данных. Вы не можете удалить pageViews из group by без получения ошибки - потому что, опять же, partition by фактически не меняет количество строк в результатах, поэтому вам необходимо включить pageViews в ваш group by который возвращает неверные результаты.

Запуск partition by без вашего group by

SELECT [year]  AS [year],
       Country AS Country,    
       SUM(pageViews) OVER(PARTITION BY [year]) AS Total
from raw_data

вернет:

Year    Country Total
2018    US      15
2018    US      15
2019    US      30
2019    US      30
2019    US      30
2019    US      30

Выбор результатов запроса на раздел и тогда группировка решит это:

select *
from
(
SELECT [year]  AS [year],
       Country AS Country,    
       SUM(pageViews) OVER(PARTITION BY [year]) AS Total
from raw_data
) as outer_query
group by outer_query.[year], outer_query.Country, outer_query.Total

, но я с GMB задаюсь вопросом, почему вам нужно сделать что-то подобное, когда будет достаточно простого агрегата.

- edit - Хотя мой ответ даст вам правильные результаты, лучше не обходить стороной, если есть более практичное решение. У Гордона есть правильный способ реализовать это - это должен быть принятый ответ.

0 голосов
/ 09 января 2020

Прежде всего, нет необходимости использовать partition by одновременно с group by в вашем запросе. Группировка и секция по большей части или все время используются по отдельности.

Это зависит от значения использования, если вы хотите, чтобы все ваши строки идентифицировались как группы без влияния на сокращение строк с используемыми нами агрегатами разделить по предложению, но если вы хотите иметь группы и с сокращением строк с агрегатами go для группы по.

Обычно бывает, что у вас много столбцов, и вы хотите выполнить агрегацию, которую вы go разделяете, но это не всегда, если только все столбцы с агрегатами не синхронизируются c. go для группы на

Group by уменьшает количество строк в агрегатах

  SELECT Year, Country, sum(pageViews) 
  total_pageviews
  FROM raw_data
  GROUP BY Year, Country

В то время как partition by дает все строки

  SELECT Year, Country, sum(pageViews) 
  Over (partition by year, country order 
   by year, country) 
   total_pageviews
  FROM raw_data

Попробуйте запустить эти 2 запроса по отдельности n видят разницу

0 голосов
/ 08 января 2020

Проблема с вашим GROUP BY, так как вы хотите общее количество просмотров страниц, вам не нужно включать его:

SELECT Year, Country, SUM(pageViews) OVER (PARTITION BY Year) AS total_pageviews
FROM raw_data
GROUP BY Year, Country;

Таким образом, total_pageviews будет основано на Year независимо от Country.

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