2024年09月26日 SQL去重保留最新一条 极客笔记
在实际的数据处理中,经常会遇到对数据库中重复数据去重的需求。在去重的过程中,我们通常会希望保留最新的一条数据,而将其他重复数据删除。本文将详细介绍在SQL中如何通过查询语句实现去重保留最新一条数据的操作。
假设我们有一个名为student
的数据库表,该表包含如下字段:
id
:学生ID,唯一标识每个学生name
:学生姓名age
:学生年龄date_updated
:数据更新时间现在,该表中可能存在一些重复数据,即name
和age
相同的记录。我们希望通过SQL查询,去除这些重复数据,并保留每组重复数据中最新的一条记录(即date_updated
最大的记录)。
为了实现上述的需求,我们可以通过以下步骤来完成去重保留最新一条数据的操作:
ROW_NUMBER()
函数为每条记录添加一个序号,按date_updated
逆序排列下面是具体的SQL语句实现:
WITH ranked_students AS (
SELECT
id,
name,
age,
date_updated,
ROW_NUMBER() OVER (PARTITION BY name, age ORDER BY date_updated DESC) AS rn
FROM
student
)
SELECT
id,
name,
age,
date_updated
FROM
ranked_students
WHERE
rn = 1;
在上面的SQL语句中,我们首先使用ROW_NUMBER()
函数为每组重复数据添加一个序号rn
,并按date_updated
逆序排列。然后,在排好序的结果中,我们选取序号为1的记录作为保留的最新数据。最终查询结果将仅包含每组重复数据中最新的一条记录。
假设我们有如下的student
表数据:
id | name | age | date_updated |
---|---|---|---|
1 | Alice | 20 | 2021-01-01 |
2 | Bob | 21 | 2021-02-15 |
3 | Alice | 20 | 2021-03-10 |
4 | Bob | 22 | 2020-12-31 |
5 | Carol | 22 | 2021-04-20 |
使用上述的SQL语句进行查询后,我们将得到如下结果:
id | name | age | date_updated |
---|---|---|---|
3 | Alice | 20 | 2021-03-10 |
4 | Bob | 22 | 2020-12-31 |
5 | Carol | 22 | 2021-04-20 |
从结果可以看出,对于重复数据(如Alice和Bob),我们保留了最新的一条记录。Carol由于没有重复数据,因此仍然保留原记录。
通过本文的介绍,我们学习了如何在SQL中实现对重复数据去重保留最新一条记录的操作。通过使用ROW_NUMBER()
函数和子查询,我们可以轻松地完成这一需求。这种方法简洁高效,适用于各种数据库系统,并且能够准确地保留每组重复数据中的最新记录,帮助我们处理实际中的数据重复问题。
本文链接:http://so.lmcjl.com/news/13992/