MySQL 滚动总和

标签 mysql sql amazon-web-services rollup

例如我有波纹管表

 DATE       QUANTITY
9/10/2017     3
9/10/2016     5
9/03/2015     6
9/10/2017     2
8/10/2017     9

我希望最终输出如下所示

YEAR    MONTH   ROLLING SUM   SUM
2015     03          6         6
2016     10          11        5
2017     10          25        14

为了得到总和,我使用下面的代码

SELECT YEAR(Date),MONTH(Date),SUM(QUANTITY) 
FROM table
GROUP BY YEAR(Date),MONTH(Date);

是否可以将 Rollup Sum 添加到同一查询中?

作为第二个注意事项: 目前我正在使用 MySQL,但运行这些查询的最终环境是 AWS Athena。我想知道这两者之间是否有中间地带来测试这些查询。

最佳答案

在大多数数据库中,您可以使用窗口函数:

SELECT YEAR(Date), MONTH(Date), SUM(QUANTITY),
       SUM(SUM(QUANTITY)) OVER (ORDER BY YEAR(DATE), MONTH(DATE) 
FROM table
GROUP BY YEAR(Date),MONTH(Date);

在 MySQL 中,我会推荐相关子查询:

SELECT YEAR(Date), MONTH(Date), SUM(QUANTITY),
       (SELECT SUM(t2.QUANTITY)
        FROM table t2
        WHERE YEAR(t2.Date) < YEAR(t.Date) OR
              (YEAR(t2.Date) = YEAR(t.Date) AND MONTH(t2.Date) <= MONTH(t.date))
       ) as rolling_sum
FROM table t
GROUP BY YEAR(Date), MONTH(Date);

关于MySQL 滚动总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645717/

相关文章:

mysql - 如何根据前一行更新 MySQL 行?

mysql - 如何加入价格但允许 +/- 30% 的差异 MySQL

mysql - 如何加速这个 MySQL 查询?

java - 如何从java输入时间戳格式到也有格式时间戳的oracle数据库?

php - 如何使用 Laravel 和 Elastic Beanstalk 上传文件?

amazon-web-services - CloudWatch 警报不会因丢失数据而触发

mysql - 在MySQL中计算上午6点之前和晚上10点之后的时间差

mysql - 将 MySQL 列中的值从第 x 行替换为第 y 行

mysql - 使用 id 从表中检索值

amazon-web-services - AWS CodeDeploy 与 GitLab 的集成