【问题标题】:Grouping MySQL query by SUM (threshold)按 SUM(阈值)对 MySQL 查询进行分组
【发布时间】:2020-07-04 22:21:51
【问题描述】:

我正在设置一个 MySQL 查询,它对数据库中的值求和并按阈值对这些值进行分组,因此它仅在达到某些值时输出“里程碑”。

数据库长这样:

date       - number
2018-12-01 - 500
2018-12-02 - 400
2018-12-03 - 300
2018-12-04 - 500
2018-12-05 - 400
etc.

预期输出:

Milestone 500 = 2018-12-01
Milestone 1000 = 2018-12-03
Milestone 2000 = 2018-12-05
etc.

里程碑应显示超过某个里程碑的第一个日期。所以2018-12-03是第一个超过1000的日期。

在每个场合,“里程碑”之间的距离都不相同。所以理想情况下,我正在寻找一个可以将 SUM 与 IF 和 GROUP 结合起来的查询?

我已经在谷歌上搜索了好几个小时,但是除了分别循环遍历所有结果并计算总值 + if 语句之外,我不知道如何做到这一点,这会消耗资源。如果可能的话,我想将其保留在查询中。

【问题讨论】:

  • 您的示例不完整。我无法重现您的结果。里程碑 1000 是 2018-12-03?为什么?
  • 对不起,关于这个,很高兴澄清:数字加起来。所以 2018-12-03 将是第一个总和超过 1000 的日期。

标签: mysql


【解决方案1】:

例如:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(date DATE NOT NULL PRIMARY KEY
,number INT NOT NULL
);

INSERT INTO my_table VALUES
('2018-12-01',500),
('2018-12-02',400),
('2018-12-03',300),
('2018-12-04',500),
('2018-12-05',400);

SELECT MIN(CASE WHEN total >=  500 THEN date END) milestone_500 
     , MIN(CASE WHEN total >= 1000 THEN date END) milestone_1000 
     , MIN(CASE WHEN total >= 2000 THEN date END) milestone_2000 
  FROM
     (
       SELECT x.*,SUM(y.number) total FROM my_table x JOIN my_table y ON y.date <= x.date GROUP BY x.date
     ) a;

+---------------+----------------+----------------+
| milestone_500 | milestone_1000 | milestone_2000 |
+---------------+----------------+----------------+
| 2018-12-01    | 2018-12-03     | 2018-12-05     |
+---------------+----------------+----------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多