首页 > 解决方案 > MySql 累计总数按天分组在最大总数上

问题描述

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

目前我有:

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

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

标签: mysqlsqldatetimesumwindow-functions

解决方案


您需要嵌套总和:

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;

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


推荐阅读