从DATETIME中选择每年的每月最后插入值

时间:2018-07-17 09:53:17

标签: mysql database

我引入了一个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的过时版本

2 个答案:

答案 0 :(得分:3)

您可以使用自联接来选择分组明智的最大行,在内部查询中,通过按月和年分组数据,可以选择const moduleSpecifier = './dir/someModule.js'; import(moduleSpecifier) .then(someModule => someModule.foo()); // executes foo method in someModule 的最大值

change_date

Demo

如果您可以使用支持窗口函数的Mysql 8,则可以使用公用表表达式和rank()函数来选择每年和每月的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

Demo

答案 1 :(得分:2)

以下查询应为您工作。 它使用按月和年分组,以查找每个月和年的最大记录。

SELECT s1.*
FROM salary s1
INNER JOIN (
    SELECT MAX(change_date) maxDate
    FROM salary
    GROUP BY MONTH(change_date), YEAR(change_date)
) s2 ON s2.maxDate = s1.change_date;

小提琴链接:http://sqlfiddle.com/#!9/1bc20b/15