【问题标题】:How to select a few rows of Running total如何选择几行运行总计
【发布时间】:2020-07-26 23:22:57
【问题描述】:

我有总计

SELECT 
    id, 
    DepositValue, 
    action_date,
    SUM(DepositValue)  OVER(ORDER by action_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Running_total

上面的选择返回了以下内容:

id  action_date   DepositValue      Running_total
1   2020-04-01         20                20
2   2020-04-02         2                 22
3   2020-04-03         8                 30
4   2020-04-04         10                38
5   2020-04-05         14                48
6   2020-04-06         15                62
7   2020-04-07         22                77
8   2020-04-08         12                99
9   2020-04-09         4                 103

我想要实现的是仅选择 Running_total 的一部分依赖于 action_date 以及已经计算出的值。

id  action_date   DepositValue      Running_total
3   2020-04-03         8                 30
4   2020-04-04         10                38
5   2020-04-05         14                48

【问题讨论】:

  • 既然你成功使用了窗口函数,你必须运行 MySQL 8.0,而不是 5.7。我相应地更改了数据库标签。
  • id 3 的运行总数是 30,但是 id 4 的运行总数是 38?

标签: mysql sql date window-functions mysql-8.0


【解决方案1】:

您可以将查询转换为子查询并在外部查询中进行过滤:

SELECT *
FROM (
    SELECT 
        id, 
        DepositValue , 
        action_date, 
        SUM(DepositValue) OVER(ORDER by action_date) AS Running_total
    FROM mytable
) t
WHERE action_date BETWEEN '2020-04-03' AND '2020-04-05'

请注意,窗口规范ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW实际上是未指定时的默认值,因此您可以将其删除。

另外,您的原始查询缺少 FROM 子句,我添加了它。

【讨论】:

  • 。 .实际上,MySQL(我认为所有数据库)中的默认窗口框架规范是RANGE BETEEN UNBOUNDED PRECEDING AND CURRENT ROW。排序键是否唯一无关紧要,但它可以在其他上下文中产生很大的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 2016-11-17
  • 2019-06-05
  • 1970-01-01
  • 2012-07-03
  • 2017-10-04
相关资源
最近更新 更多