MySql 累计总数按天分组在最大总数上

Posted

技术标签:

【中文标题】MySql 累计总数按天分组在最大总数上【英文标题】:MySql cumulative total grouped by day on maximum total 【发布时间】:2020-10-14 13:57:55 【问题描述】:

我正在尝试计算在给定日期可能多次出现的值的累积总和。因此我只想保持每一天的最大值。

目前我有:

SELECT
  DATE_FORMAT(created_at, '%d/%m') AS day1,
  SUM(principal) over (order by created_at) AS tot
FROM loan;

输出:

[
    
        "day1" : "21/08",
        "tot" : 200
    ,
    
        "day1" : "21/08",
        "tot" : 1200
    ,
    
        "day1" : "21/08",
        "tot" : 2200
    ,
    
        "day1" : "21/08",
        "tot" : 2500
    ,
    
        "day1" : "25/08",
        "tot" : 4500
    ,
    
        "day1" : "25/08",
        "tot" : 6500
    ,
    
        "day1" : "27/08",
        "tot" : 7000
    ,
    
        "day1" : "27/08",
        "tot" : 7600
    
]

我知道我需要按天对它进行分组,但它需要为每组天取最大值。有什么想法吗?

当我这样分组时:

SELECT
  DATE_FORMAT(created_at, '%d/%m') AS day1,
  SUM(principal) over (order by created_at) AS tot
FROM loan
GROUP BY day1;

我明白了:

[
    
        "day1" : "21/08",
        "tot" : 1000
    ,
    
        "day1" : "25/08",
        "tot" : 3000
    ,
    
        "day1" : "27/08",
        "tot" : 3500
    ,
    
        "day1" : "30/08",
        "tot" : 4200
    
]

这显然是错误的。我不知道为什么它会给出那个输出。但是我怎样才能让它正确呢?

【问题讨论】:

请向我们展示您想要的结果。 【参考方案1】:

你需要嵌套总和:

SELECT DATE_FORMAT(created_at, '%d/%m') AS day1,
       SUM(SUM(principal)) OVER (ORDER BY MIN(created_at)) AS tot
FROM loan
GROUP BY day1;

我很惊讶您的版本完全有效。它在大多数数据库中都会失败,因为 principalcreated_at 都不是聚合键。

【讨论】:

【参考方案2】:

大概,你想要:

select
    date_format(created_at, '%d/%m') as day1,
    max(sum(principal) over (order by created_at)) as tot
from loan
group by day1

其实,你也可以用distinct来表达,稍微不同的order by子句:

select distinct
    date_format(created_at, '%d/%m') as day1,
    sum(principal) over (order by date(created_at)) as tot
from loan

我不太喜欢您表示日期的方式;如果您的数据分布超过一年,结果将变得模棱两可(在第二个选项中),甚至是错误的(在第一个查询中)。我建议将年份添加到日期表示中,或者只是 date(created_at),这基本上会截断时间部分。

【讨论】:

以上是关于MySql 累计总数按天分组在最大总数上的主要内容,如果未能解决你的问题,请参考以下文章

Mysql查看连接数(连接总数活跃数最大并发数)

SQL分组查询最大值最小值

MySQL数据库基本用法-聚合-分组

在 BigQuery 中获取按天分组的最大数量的唯一 ID

PHP怎么获得mysql分组后记录查询总数。

SQL Server:从多个客户的多个订单中选择最大的订单总数,并且每个订单上有多个项目