繁体   English   中英

MySql 累计总数按天分组,最大总数

[英]MySql cumulative total grouped by day on maximum total

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

目前我有:

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
    }
]

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

您需要嵌套总和:

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都不是聚合键。

想必,你想要:

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) ,这基本上会截断时间部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM