mysql - 从 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 的过时版本
解决方案
您可以使用自联接来选择组明智的最大行,在内部查询中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;
推荐阅读
- kubernetes - Kubernetes如何在私网中容易受到网络攻击
- python - 在 python pandas 数据框中聚合行
- python - 是否需要神经网络(keras)才能使用分类器(sklearn)
- r - 无法为签名“xml_document”找到函数“readHTMLTable”的继承方法
- google-analytics - 可以解码谷歌分析的fbclid url,用户来自哪里?
- spring-batch - 使用 spring-cloud-deployer-cloudfoundry 启动分区的 spring 批处理作业
- sql - 如何使用条件返回多行计数?
- sql - 如何将本地服务器上运行的数据库迁移到另一台机器上
- javascript - Vue.js : v-bind:class 如果一个数组存在并且该数组包含一些东西
- angular - 连接到 VPN 后,Angular 7 站点“无法访问”