Sql 为什么在使用OVER(按yearValue分区)时会得到不同的和值?

Sql 为什么在使用OVER(按yearValue分区)时会得到不同的和值?,sql,google-bigquery,Sql,Google Bigquery,黄色表格为原始数据,绿色表格为所需输出 当我使用下面的代码时,我得到了上面的绿色表格 SELECT Year, Country, sum(pageViews) total_pageviews FROM raw_data GROUP BY Year, Country 然而,当我尝试按年份划分时,我得到的数字更低 SELECT DISTINCT Year, Country, SUM(pageViews) OVER (PARTITION BY Year) FROM raw_data GROUP

黄色表格为原始数据,绿色表格为所需输出

当我使用下面的代码时,我得到了上面的绿色表格

SELECT Year, Country, sum(pageViews) total_pageviews
FROM raw_data
GROUP BY Year, Country
然而,当我尝试按
年份划分时,我得到的数字更低

SELECT DISTINCT Year, Country, SUM(pageViews) OVER (PARTITION BY Year) 
FROM raw_data
GROUP BY Year, Country, pageViews
所以输出如下所示
你知道为什么在使用
分区依据时会发生这种情况吗?

你的
分组依据有问题,因为你想要总的页面浏览量,所以你不需要包括它:

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

因此,
total_pageviews
将基于
年份
,而不考虑
国家

您的
分组依据的问题
,因为您需要总的页面浏览量,所以您不需要包括它:

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

因此,
total_pageviews
将基于
,而不管
国家

,我不确定除了使用子查询之外,这实际上是可能的
partitionby
不会像
groupby
那样更改返回的行数,因此代码仍然会为每个数据项返回一行。您无法从
分组依据
中删除
页面视图
,而不会收到错误-因为同样,
分区依据
实际上不会更改结果中的行数,因此您需要在
分组依据
中包含
页面视图
,这将返回不正确的结果

运行
分区依据
,而不使用
分组依据

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在一起的问题是,当一个简单的聚合就足够了的时候,为什么你需要做这样的事情


-编辑-虽然我的答案会让您得到正确的结果,但如果有更实际的解决方案,最好不要进行变通。Gordon有正确的方法来实现这一点——这应该是公认的答案。

我不确定这在使用子查询之外是否确实可行
partitionby
不会像
groupby
那样更改返回的行数,因此代码仍然会为每个数据项返回一行。您无法从
分组依据
中删除
页面视图
,而不会收到错误-因为同样,
分区依据
实际上不会更改结果中的行数,因此您需要在
分组依据
中包含
页面视图
,这将返回不正确的结果

运行
分区依据
,而不使用
分组依据

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在一起的问题是,当一个简单的聚合就足够了的时候,为什么你需要做这样的事情


-编辑-虽然我的答案会让您得到正确的结果,但如果有更实际的解决方案,最好不要进行变通。Gordon有正确的方法来实现这一点-这应该是公认的答案。

您的
组中有
页面视图
,因此您的代码实际上没有聚合。这是你问题的根源

相反,您似乎在尝试:

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;

您在
组中有
页面浏览量
,因此您的代码实际上没有聚合。这是你问题的根源

相反,您似乎在尝试:

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;

下面是BigQuery标准SQL

第一个查询是获得预期结果的最正确方法

但,若出于任何原因,您希望包含分析函数(如在第二个查询中),则应使用以下版本

#standardSQL
SELECT Year, Country, SUM(SUM(pageViews)) OVER(PARTITION BY Year, Country) total_pageviews
FROM `project.dataset.raw_data`
GROUP BY Year, Country

下面是BigQuery标准SQL

第一个查询是获得预期结果的最正确方法

但,若出于任何原因,您希望包含分析函数(如在第二个查询中),则应使用以下版本

#standardSQL
SELECT Year, Country, SUM(SUM(pageViews)) OVER(PARTITION BY Year, Country) total_pageviews
FROM `project.dataset.raw_data`
GROUP BY Year, Country

首先,在查询中,
分区依据
分组依据
同时使用是没有用的。Group by和partition by大部分或所有时间是分开使用的

这取决于用法含义,如果您希望将所有行标识为组,而不影响使用聚合减少行数,我们使用partition by子句,但如果您希望使用组并使用聚合减少行数,则使用group by

通常情况下,当你有很多列并且你想执行聚合时,你会选择分区依据,但这并不总是如此,除非所有包含聚合的列都同步,否则你可以选择分组依据

groupby
减少聚合上的行数

  SELECT Year, Country, sum(pageViews) 
  total_pageviews
  FROM raw_data
  GROUP BY Year, Country
partitionby
则给出所有行

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

尝试分别运行这两个查询以查看差异首先,在查询中不需要同时使用
分区依据
分组依据
。Group by和partition by大部分或所有时间是分开使用的

这取决于用法含义,如果您希望将所有行标识为组,而不影响使用聚合减少行数,我们使用partition by子句,但如果您希望使用组并使用聚合减少行数,则使用group by

通常情况下,当你有很多列并且你想执行聚合时,你会选择分区依据,但这并不总是如此,除非所有包含聚合的列都同步,否则你可以选择分组依据

groupby
减少聚合上的行数

  SELECT Year, Country, sum(pageViews) 
  total_pageviews
  FROM raw_data
  GROUP BY Year, Country
partitionby
则给出所有行

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

尝试分别运行这两个查询以查看差异

您期望的实际结果是什么?所需的输出-即使用
SUM(页面视图)覆盖(分区B)的绿色框