sql - 为多个分层组优化 SUM OVER PARTITION BY

标签 sql sql-server window-functions partition-by

我有如下表格:

Region    Country    Manufacturer    Brand    Period    Spend
R1        C1         M1              B1       2016      5
R1        C1         M1              B1       2017      10
R1        C1         M1              B1       2017      20
R1        C1         M1              B2       2016      15
R1        C1         M1              B3       2017      20
R1        C2         M1              B1       2017      5
R1        C2         M2              B4       2017      25
R1        C2         M2              B5       2017      30
R2        C3         M1              B1       2017      35
R2        C3         M2              B4       2017      40
R2        C3         M2              B5       2017      45

我需要在不同的组中找到 SUM([Spend],如下所示:

  1. 整个表中所有行的总支出
  2. 每个地区
  3. 的总支出
  4. 每个地区和国家组的总支出
  5. 每个地区、国家和广告商组的总支出

所以我在下面写了这个查询:

SELECT 
    [Period]
    ,[Region]
    ,[Country]
    ,[Manufacturer]
    ,[Brand]
    ,SUM([Spend]) OVER (PARTITION BY [Period]) AS [SumOfSpendWorld]
    ,SUM([Spend]) OVER (PARTITION BY [Period], [Region]) AS [SumOfSpendRegion]
    ,SUM([Spend]) OVER (PARTITION BY [Period], [Region], [Country]) AS [SumOfSpendCountry]
    ,SUM([Spend]) OVER (PARTITION BY [Period], [Region], [Country], [Manufacturer]) AS [SumOfSpendManufacturer]
FROM myTable

但是对于只有 45 万行的表,该查询需要 >15 分钟。我想知道是否有任何方法可以优化此性能。预先感谢您的回答/建议!

最佳答案

你对问题的描述向我建议grouping sets:

SELECT YEAR([Period]) AS [Period], [Region], [Country], [Manufacturer], 
       SUM([Spend])
GROUP BY GROUPING SETS ( (YEAR([Period]),
                         (YEAR([Period]), [Region]),
                         (YEAR([Period]), [Region], [Country]), 
                         (YEAR([Period]), [Region], [Country], [Manufacturer])
                        );

我不知道这是否会更快,但它肯定看起来更符合您的问题。

关于sql - 为多个分层组优化 SUM OVER PARTITION BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516844/

相关文章:

asp.net - aspx 页面中出现错误消息 "String was not recognized as a valid Boolean"

c# - Linq SQL 在服务器端或应用程序端不同吗?

php - sql注入(inject)是否可以通过 file_get_contents ("php://input");或者只用 get 和 post 就可以了?

sql - 对 mysql 查询使用反引号/反引号

c# - 从 C# ASP WEB 应用程序测试 SQL 连接

SQL Server 2008 - 查找具有最多行的表

postgresql - 选择直到 postgresql 中的行匹配?

apache-spark - Pyspark : Custom window function

sql - 过滤具有相同 ID 的前一行具有特定值的数据

mysql - 连接两个表中的多个列