如何在MYSQL中获取每个月的最大日期

如何在MYSQL中获取每个月的最大日期,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,如何获得每个月的最长日期?我不知道我做错了什么,但根据我的结果,数据是重复的 这是桌子 history table 因此,在我的历史记录表中,我得到了每个月的日期范围,这取决于用户每天更改成本的次数 所以基本上 输出应该是这样的 id price range_date total_usage 1 5 2019-09-01 - 2019-09-15 SUM(total_usage) based on the date range 2

如何获得每个月的最长日期?我不知道我做错了什么,但根据我的结果,数据是重复的

这是桌子

history table
因此,在我的历史记录表中,我得到了每个月的日期范围,这取决于用户每天更改成本的次数

所以基本上

输出应该是这样的

id   price         range_date         total_usage  
1      5     2019-09-01 - 2019-09-15  SUM(total_usage) based on the date range
2      10    2019-09-16 - 2019-09-30  SUM(total_usage) based on the date range
3      15    2019-10-01 - 2019-10-15  SUM(total_usage) based on the date range
4      20    2019-10-16 - 2019-09-19  SUM(total_usage) based on the date range
5      25    2019-10-20 - 2019-10-31  SUM(total_usage) based on the date range
在那之后,我计划每个月总结一下。基于这5行的输出

这是我当前的查询,如果他们只有一个价格历史记录,我可以这样做,如果只有一个价格历史记录,这是一个单独的查询,但是对于多个价格历史记录,我真的很难得到每个月的范围和它们的总和

SELECT price.price,
       price.from _range AS first_range, 
       price.to_range AS second_range,  
       (current_usage.total_usage),
       current_usage.date_created
FROM history AS price
INNER JOIN current_usage AS current_usage 
        ON price.main_id = current_usage .main_id
INNER JOIN(SELECT MAX(to_range) AS maxdate
           FROM history
           GROUP BY YEAR(to_range), MONTH(to_range)) x ON price.to_range= maxdate

非常感谢您的任何帮助,我真的需要一些帮助。

如果我理解正确,您只需根据
当前使用情况
表的
创建日期
进行连接,即可从
历史
表的
范围
范围

选择
p、 身份证,
p、 价格,
日期(p.from_range)作为第一个_range,
日期(如果(p.to_范围='0000-00-00 00:00:00',最后一天(p.from_范围),p.to_范围))作为第二个_范围,
总和(c.总使用量)作为总使用量
从历史看p
内部联接当前的_用法为c
在c.main\u id=p.main\u id上
和c.在日期(p.从范围)和日期(如果(p.到范围='0000-00-00 00 00:00:00',最后一天(p.从范围),p.到范围)之间创建的日期
按p.id分组

我假设
history
表中的
id
列是您的主键。因此,SELECT子句中
history
表中的其余非聚合列在功能上是相关的,因此如果理解正确,无需在
GROUP BY
中指定它们,您只需根据
当前使用情况
表的
创建日期
进行联接,即可将
历史
表的
范围
范围

选择
p、 身份证,
p、 价格,
日期(p.from_range)作为第一个_range,
日期(如果(p.to_范围='0000-00-00 00:00:00',最后一天(p.from_范围),p.to_范围))作为第二个_范围,
总和(c.总使用量)作为总使用量
从历史看p
内部联接当前的_用法为c
在c.main\u id=p.main\u id上
和c.在日期(p.从范围)和日期(如果(p.到范围='0000-00-00 00 00:00:00',最后一天(p.从范围),p.到范围)之间创建的日期
按p.id分组

我假设
history
表中的
id
列是您的主键。因此,SELECT子句中
history
表中的其余非聚合列在功能上是相关的,因此无需在
GROUP BY

中指定它们,非常感谢!,只有一个问题,如果p.to\u范围是0000:00:00,那么每个主\u id的最后一行总是这样的value@JanessaBautista在这种情况下,您希望它是该月的最后一天吗?您可以使用If来检查它是否为0000-00-00,如果为true,则使用最后一天功能从开始日期开始。非常感谢!我真的很感激!。我只需要将所有行相加就可以得到总数!。再次感谢,先生!帮个大忙!非常感谢,先生!,只有一个问题,如果p.to\u范围是0000:00:00,那么每个主\u id的最后一行总是这样的value@JanessaBautista在这种情况下,您希望它是该月的最后一天吗?您可以使用If来检查它是否为0000-00-00,如果为true,则使用最后一天功能从开始日期开始。非常感谢!我真的很感激!。我只需要将所有行相加就可以得到总数!。再次感谢,先生!帮个大忙!
id    main_id    total_usage   date_created
1         1          10         2019-09-01     
2         1          10         2019-09-02 
3         1          10         2019-09-03 
4         1          10         2019-09-04 
5         1          10         2019-09-05 
6         1          10         2019-09-06 
7         1          20         2019-09-07 
8         1          5          2019-09-08 
9         1          5          2019-09-09 
10        1          10         2019-09-10 
11        1          10         2019-09-15     
12        1          10         2019-09-16 
13        1          10         2019-09-17 
14        1          10         2019-09-18 
15        1          10         2019-09-19 
16        1          10         2019-09-20 
17        1          20         2019-09-25 
18        1          5          2019-09-26 
19        1          5          2019-09-27 
20        1          10         2019-09-30
21        1          10         2019-10-01 
22        1          10         2019-10-02    
23        1          10         2019-10-03 
24        1          10         2019-10-10 
25        1          10         2019-10-11 
26        1          10         2019-10-12
27        1          10         2019-10-18 
28        1          20         2019-10-20
29        1          5          2019-10-21 
30        1          5          2019-10-22
31        1          10         2019-10-23  
id   price         range_date         total_usage  
1      5     2019-09-01 - 2019-09-15  SUM(total_usage) based on the date range
2      10    2019-09-16 - 2019-09-30  SUM(total_usage) based on the date range
3      15    2019-10-01 - 2019-10-15  SUM(total_usage) based on the date range
4      20    2019-10-16 - 2019-09-19  SUM(total_usage) based on the date range
5      25    2019-10-20 - 2019-10-31  SUM(total_usage) based on the date range
SELECT price.price,
       price.from _range AS first_range, 
       price.to_range AS second_range,  
       (current_usage.total_usage),
       current_usage.date_created
FROM history AS price
INNER JOIN current_usage AS current_usage 
        ON price.main_id = current_usage .main_id
INNER JOIN(SELECT MAX(to_range) AS maxdate
           FROM history
           GROUP BY YEAR(to_range), MONTH(to_range)) x ON price.to_range= maxdate