首页 > 解决方案 > 从 DATETIME 中选择每年每个月的最后插入值

问题描述

我有一个 DATETIME 来存储引入的值,如下例所示:

CREATE TABLE IF NOT EXISTS salary (
    change_id INT(11) NOT NULL AUTO_INCREMENT,
    emp_salary FLOAT(8,2),
    change_date DATETIME,
    PRIMARY KEY (change_id)
);

我将像这样填写示例:

+-----------+------------+---------------------+
| change_id | emp_salary |     change_date     |
+-----------+------------+---------------------+
|         1 |     200.00 | 2018-06-18 13:17:17 |
|         2 |     700.00 | 2018-06-25 15:20:30 |
|         3 |     300.00 | 2018-07-02 12:17:17 |
+-----------+------------+---------------------+

我想获取每年每个月的最后一个插入值。

所以对于我做的例子,这应该是 Select 的输出:

+-----------+------------+---------------------+
| change_id | emp_salary |     change_date     |
+-----------+------------+---------------------+
|         2 |     700.00 | 2018-06-25 15:20:30 |
|         3 |     300.00 | 2018-07-02 12:17:17 |
+-----------+------------+---------------------+

1 不会出现,因为是 2 的过时版本

标签: mysqldatabase

解决方案


您可以使用自联接来选择组明智的最大行,在内部查询中change_date通过按月和年对数据进行分组来选择最大值

select t.*
from your_table t
join (
  select max(change_date) max_change_date
  from your_table
  group by date_format(change_date, '%Y-%m')
) t1
on t.change_date = t1.max_change_date

演示

如果您可以使用支持窗口函数的 Mysql 8,您可以使用公用表表达式和 rank() 函数来选择每年和每月更改日期最高的行

with cte as(
    select *, 
    rank() over (partition by date_format(change_date, '%Y-%m') order by change_date desc ) rnk
    from your_table

)

select * from cte where rnk = 1;

演示


推荐阅读