【问题标题】:Cumulative Sum of Count累计计数
【发布时间】:2014-03-01 01:08:30
【问题描述】:

我想知道一个计数上的累积总和是否可能。我想研究的一个例子是今年影响美国的风暴。我想要一个列出 2014 年月份的结果集,以及在该月之前影响美国的风暴的累积总和。我希望得到 3 列的内容 - Month、NumberofStorms 和 CumulativeSum,如下所示:

Month        NumberofStorms     CumulativeSum
-----------------------------------------------
Jan              2                   2
Feb              1                   3
Mar              1                   4
Apr              0                   4
May              0                   4
Jun              0                   4
Jul              0                   4
Aug              0                   4    
Sep              1                   5
Oct              3                   8
Nov              5                  13 
Dec              8                  21

我怎样才能做到这一点?

【问题讨论】:

  • 您使用的是什么数据库?你试过什么了?另外,您的源数据是什么样的?
  • 这不是一个真实的场景,但我正在尝试创建场景并回答它们,以便我可以学习 sql 中的分析函数。我想在 Oracle 数据库上使用我的查询。

标签: sql count sum


【解决方案1】:

你可以给SUM()添加一个窗口:

SELECT "Month"
      ,"NumberofStorms"
      ,SUM("NumberofStorms") OVER(ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum
FROM Table1

演示:SQL Fiddle

注意:在演示中月份是按字母顺序排序的,因为这只是一个示例场景,所以不必费心输入真实日期。

更新:假设基表只是 MonthStormName,您需要一个 cte/子查询来首先获得一个计数,然后您可以在上面的运行总数中使用它:

SELECT "Month"
      ,"NumberofStorms"
      ,SUM("NumberofStorms") OVER(ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum
FROM (SELECT "Month",COUNT("Name") AS "NumberofStorms"
      FROM Weather
      GROUP BY "Month"
      ) AS Sub

【讨论】:

  • 这接近我的预期。但是假设我没有一个名为“NumberofStorms”的专栏。假设我有一个名为 Weather 的表,其中为每个发生的风暴创建了一行,列分别为 Month、Storm Name。在这种情况下,我需要一个 count() 不是吗?
  • 当然,您只需使用 cte/子查询来获取计数,然后计算运行总计。查看更新。
【解决方案2】:

您可以在没有子查询的情况下进行累积和。如果NumberOfStorms 是原始数据的一部分:

SELECT "Month", "NumberofStorms",
       SUM(NumberofStorms) OVER (ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum
FROM Weather
GROUP BY "Month", NumberOfStorms;

而且,在许多数据库中,row 子句是不必要的,因此以下内容也应该起作用:

SELECT "Month", "NumberofStorms",
       SUM(NumberofStorms) OVER (ORDER BY "Month") as CumulativeSum
FROM Weather
GROUP BY "Month", NumberOfStorms;

如果NumberOfStorms 真的来自count(*),那么你会这样做:

SELECT "Month", count(*) as "NumberofStorms",
       SUM(count(*)) OVER (ORDER BY "Month") as CumulativeSum
FROM Weather
GROUP BY "Month";

一开始看累积和和窗口/解析函数的组合看起来有点奇怪,很快就会习惯。

【讨论】:

  • 难道你不必对count()使用按月分组,这样就可以得到每个月的风暴数吗?
  • @Canzee 。 . .如果您想要每月的风暴数,那么您可以将COUNT(*) as StormsPerMonth 添加到select 子句中。我明白了,这显然是问题的一部分。我专注于累积部分。我很困惑NumberOfStorms 是原始数据的一部分吗?
  • 原始表 Weather 只有 Month 和 StormName 列。表中没有 NumberofStorms。
  • @Canzee 。 . .查看最后一个查询。
猜你喜欢
  • 2021-08-05
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
相关资源
最近更新 更多