SQL多条记录,只保留最新的一条

2024年10月04日 SQL多条记录 只保留最新的一条 极客笔记

SQL多条记录,只保留最新的一条

在实际的数据库操作中,经常会遇到需要查询多条记录中只保留最新一条的场景。这种需求通常会出现在需要显示最新更新的数据或者只保留最近的一条记录的情况下。在这篇文章中,我将分享如何使用SQL语句来实现这个功能。

场景分析

假设有一个名为employee的员工表,表结构如下:

id name department salary update_time
1 Alice HR 5000 2022-01-01 08:00:00
2 Bob IT 6000 2022-01-02 10:00:00
3 Charlie Finance 7000 2022-01-03 12:00:00
4 Diana Sales 5500 2022-01-04 14:00:00

现在的需求是查询出每个部门最新的员工信息,并只保留最新的一条记录。

解决方案

方法一:使用子查询和MAX函数

SELECT e1.id, e1.name, e1.department, e1.salary, e1.update_time
FROM employee e1
INNER JOIN (
    SELECT department, MAX(update_time) AS max_update_time
    FROM employee
    GROUP BY department
) e2 ON e1.department = e2.department AND e1.update_time = e2.max_update_time;

上面的SQL语句首先通过子查询获取每个部门最新的update_time,然后再通过INNER JOIN将获取到的最新时间和员工表匹配,最终筛选出每个部门最新的员工信息。

方法二:使用ROW_NUMBER()窗口函数

WITH ranked_employee AS (
    SELECT id, name, department, salary, update_time,
           ROW_NUMBER() OVER (PARTITION BY department ORDER BY update_time DESC) AS rn
    FROM employee
)
SELECT id, name, department, salary, update_time
FROM ranked_employee
WHERE rn = 1;

这种方法利用ROW_NUMBER()窗口函数按照部门分组并按照更新时间降序排列,然后保留每个部门的最新记录。

运行结果

对于上述两种方法,假设在employee表中插入一些新的员工信息后,运行结果如下:

id name department salary update_time
1 Alice HR 5000 2022-01-01 08:00:00
2 Bob IT 6000 2022-01-02 10:00:00
3 Charlie Finance 7000 2022-01-03 12:00:00
4 Diana Sales 5500 2022-01-04 14:00:00
5 Emily HR 5200 2022-01-05 09:00:00
6 Frank IT 6200 2022-01-06 11:00:00
7 Grace Finance 7300 2022-01-07 13:00:00
8 Henry Sales 5800 2022-01-08 15:00:00

经过运行上述两种方法后,最终查询结果如下:

id name department salary update_time
5 Emily HR 5200 2022-01-05 09:00:00
6 Frank IT 6200 2022-01-06 11:00:00
7 Grace Finance 7300 2022-01-07 13:00:00
8 Henry Sales 5800 2022-01-08 15:00:00

以上为运行结果,分别展示了每个部门中最新的员工信息。

总结

在实际的数据库操作中,需要查询多条记录并只保留最新的一条是一种常见的需求。通过使用SQL语句中的子查询、MAX函数或ROW_NUMBER()窗口函数等方法,可以很方便地实现这一功能。根据具体的场景和需求选择合适的方法来处理数据,能够提高程序的运行效率和可读性,同时也能更好地满足业务需求。

本文链接:http://so.lmcjl.com/news/14594/

展开阅读全文