【问题标题】:Cumulative value with data grouping数据分组的累积值
【发布时间】:2022-02-03 22:07:46
【问题描述】:

对于以下查询,我需要一些专业知识帮助。 所以,我需要根据 GMV 金额进行每天的累计计算。

我最大的问题是我无法从 GROUP BY 中删除 gmv,否则会出错。

关于如何解决这个问题的任何想法?

SELECT CONVERT(varchar, order_date, 103) AS date,
       DATEPART(WEEKDAY, order_date) AS weekday,
       SUM(gmv) OVER (ORDER BY order_date ROWS UNBOUNDED PRECEDING) AS cumulative
FROM database
WHERE order_date BETWEEN '2017-02-01' AND '2017-08-01'
GROUP BY order_date,
         gmv;

【问题讨论】:

  • 您需要先在您的组中聚合,在派生表中,然后使用您的窗口聚合。
  • 不确定该怎么做
  • order_date 是日期还是日期和时间?

标签: sql sql-server date group


【解决方案1】:

正如我在 cmets 中提到的,首先使用派生表来获取组中的聚合,然后进行累积 SUM

WITH CTE AS
    (SELECT CONVERT(date, order_date) AS OrderDate, --I assume here that Order_date is a date and time value
            SUM(GMV) AS GMV
     FROM dbo.Raw_data
     GROUP BY CONVERT(date, order_date))
SELECT OrderDate,
       DATEPART(WEEKDAY, OrderDate) AS WeekDay,
       SUM(GMV) OVER (ORDER BY OrderDate ASC
                      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CumulativeGMV
FROM CTE;

【讨论】:

  • 或者您可以使用 CROSS APPLY ( SELECT CONVERT(date, order_date) ) 并避免 CTE。 ROWS UNBOUNDED PRECEDING 也是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 的相同但更短的版本
  • 技术上根本不需要边界,@Charlieface,因为 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 是添加 ORDER BY 时的默认边界;我只是更喜欢明确。
  • 不是,默认是RANGE UNBOUNDED PRECEDING,它有细微的不同,性能较差,而且会绊倒所有人,因为除非您有非唯一的排序,否则它看起来一样。我不知道,ROWS UNBOUNDED PRECEDING 对我来说看起来很明确,我想不管你的船是什么。无论如何都要 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2019-05-04
  • 2015-11-27
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多