数据去重与重复数据的高效处理策略

在实际业务中,数据去重是一个非常常见的需求,特别是在日志数据、用户操作记录或交易记录等领域。去重不仅仅是删除重复数据,更重要的是按照业务规则保留最有价值的数据记录

本文将探讨如何在 SQL 中高效地处理重复数据,通过 DISTINCTROW_NUMBER()GROUP BY 等方法解决不同场景下的数据去重问题。


一、常见的去重场景

  1. 用户登录记录:保留每个用户的最新登录记录,删除其他重复记录。
  2. 订单数据:针对重复订单记录,保留金额最大的订单或最新的订单记录。
  3. 日志分析:在日志表中去除重复的操作记录,只保留最近一次操作。

二、数据示例

假设有一个用户登录记录表 user_logins,其结构如下:

iduser_idlogin_timedevice
11012024-01-01 08:30:00PC
21012024-01-02 10:00:00Mobile
31022024-01-01 09:15:00PC
41032024-01-01 14:45:00Tablet
51012024-01-03 11:00:00Mobile
61022024-01-04 16:30:00Mobile

目标

  • 保留每个用户最近一次的登录记录,删除其他重复数据。

三、常用去重方法


1. 使用 DISTINCT 进行简单去重

DISTINCT 用于去除表中完全重复的行,适用于整个记录重复的场景。

SELECT DISTINCT user_id, device
FROM user_logins;

适用场景

  • 适合字段完全相同的简单重复数据。
  • 局限性DISTINCT 只能消除完全重复的行,如果存在时间戳不同但用户相同的记录,将无法处理。

2. 使用 GROUP BY 与聚合函数

通过 GROUP BY 分组和 MAX 函数,可以保留每组中的最新记录。

SELECT user_id, MAX(login_time) AS latest_login
FROM user_logins
GROUP BY user_id;

适用场景

  • 按用户分组,保留每个用户最新的登录时间。
  • 局限性:只能返回最大(最新)时间,无法保留完整记录中的其他字段(如设备类型)。

优化版本:使用子查询保留完整记录

SELECT * 
FROM user_logins u
WHERE login_time = (SELECT MAX(login_time)FROM user_loginsWHERE user_id = u.user_id
);
  • 说明:子查询筛选出每个用户最新的登录时间,再通过主查询返回完整记录。

3. 使用 ROW_NUMBER() 进行去重

ROW_NUMBER() 是 SQL 窗口函数,可以为每组记录生成唯一的序号,从而方便地保留最新或特定排名的记录。

WITH ranked_logins AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY user_idORDER BY login_time DESC) AS rnFROM user_logins
)
SELECT id, user_id, login_time, device
FROM ranked_logins
WHERE rn = 1;

适用场景

  • 适合去除分组内的重复记录,保留每组中最新的一条记录。
  • 优势:可以返回完整的记录而不丢失其他字段。
  • 局限性:需要数据库支持窗口函数(如 MySQL 8.0+、PostgreSQL、SQL Server)。

4. 使用 DELETE 删除重复数据

如果要直接在表中删除重复记录,可以使用 ROW_NUMBER() 标记重复数据,然后删除排名大于 1 的行。

WITH ranked_logins AS (SELECT id,ROW_NUMBER() OVER (PARTITION BY user_idORDER BY login_time DESC) AS rnFROM user_logins
)
DELETE FROM user_logins
WHERE id IN (SELECT id FROM ranked_logins WHERE rn > 1
);
  • 说明:只保留每个用户最新的一条登录记录,删除其余记录。

四、性能对比与优化策略

性能对比
方法执行速度复杂度适用场景
DISTINCT简单去除完全重复的行
GROUP BY + MAX一般按分组保留最新或最早的记录
ROW_NUMBER()一般分组去重并保留完整记录
DELETE + ROW_NUMBER()复杂删除分组内多余记录

优化建议
  1. 索引优化:在去重字段(如 user_idlogin_time)上创建索引,可以显著提高查询速度。
CREATE INDEX idx_user_login ON user_logins(user_id, login_time DESC);
  1. 批量处理:对于超大数据量表,使用批量删除或分批次去重,避免锁表或性能瓶颈。
DELETE FROM user_logins
WHERE id IN (SELECT idFROM user_loginsWHERE login_time < NOW() - INTERVAL 30 DAY
);
  1. 避免全表扫描:在查询时尽量减少无关字段,只查询需要去重的字段,减少数据库 I/O 操作量。

五、实战案例:每日用户登录记录去重

需求描述

  • 保留每个用户最近一次的登录记录,删除多余的历史记录。
WITH ranked_logins AS (SELECT id,ROW_NUMBER() OVER (PARTITION BY user_idORDER BY login_time DESC) AS rnFROM user_logins
)
DELETE FROM user_logins
WHERE id IN (SELECT id FROM ranked_logins WHERE rn > 1
);

结果

  • 每个用户仅保留一条最近的登录记录。

六、总结

  1. DISTINCT 适合简单重复数据的去重。
  2. GROUP BY + 聚合函数 是最常用的去重方式,适合按特定规则分组去重。
  3. ROW_NUMBER() 提供了更强的灵活性,可以按业务规则保留最优记录,删除其他重复数据。
  4. 性能优化:结合索引与批量处理策略,能有效提升大数据量表的去重效率。

通过合理选择去重策略,可以确保数据的唯一性和完整性,同时提升数据库查询性能,保证业务系统的稳定高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

【Cesium】三、实现开场动画效果

文章目录 实现效果实现方法实现代码组件化 实现效果 实现方法 Cesium官方提供了Camera的flyTo方法实现了飞向目的地的动画效果。 官方API&#xff1a;传送门 这里只需要用到目的地&#xff08;destination&#xff09;和持续时间&#xff08;duration&#xff09;这两个参数…

【游戏设计原理】47 - 超游戏思维

对于这条原理&#xff0c;我首先想到的是开放世界&#xff0c;或者探索性游戏&#xff0c;这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则&#xff0c;玩家的可操作性很强。就像上图里的沙池一样&#xff0c;里面有滑梯&#xff0c;是规则性比较明确的&#xff0c;而…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近&#xff0c;DeepSeek v3&#xff08;一个MoE模型&#xff0c;拥有671B参数&#xff0c;其中37B参数被激活&#xff09;模型全球爆火。 作为一款能与Claude 3.5 Sonnet&#xff0c;GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源&#xff0c;还放出一份扎实的技术…

Kbuild学习知识点

1.Kbuild本质&#xff1a;一个可扩展、可配置的Makefile框架&#xff0c;递归式Makefile&#xff0c;菜单式配置。 2.Kbuild构成&#xff1a; Makefile:顶层目录下的Makefile.config:内核的配置文件arch/S(ARCH)/Makefile:跟平台架构相关的Makefilescripts/Makefile.*:通用编…

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

后端java开发路由接口并部署服务器(四)

一、安装IntelliJ IDEA&#xff0c;安装包下载 1、官网下载 2、网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 打开IntelliJ IDEA&#xff0c;输入网盘资源文件内容 三、汉化处理 插件搜索chinese&#xff0c;就会找到相应的插件安装重启软件即可 四、新建后端j…

一文理解ssh,ssl协议以及应用

在使用基于密钥的认证方式的时候&#xff0c;私钥的位置一定要符合远程服务器规定的位置&#xff0c;否则找不到私钥的位置会导致建立ssh连接失败 SSH 全称是 “Secure Shell”&#xff0c;即安全外壳协议。 它是一种网络协议&#xff0c;用于在不安全的网络中安全地进行远程登…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…

FPGA、STM32、ESP32、RP2040等5大板卡,结合AI,更突出模拟+数字+控制+算法

板卡选择困难症了&#xff1f;如果你也想玩FPGA、STM32、ESP32、RP2040相关的板卡&#xff0c;不如看看以下几款板卡&#xff0c;如果正巧碰上能实现你想要做的项目呢~ 01 小脚丫FPGA STEP BaseBoard V4.0套件 STEP BaseBoard V4.0是第4代小脚丫FPGA扩展底板&#xff08;点击了…

python进阶06:MySQL

课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹&#xff0c;输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …

lec7-路由与路由器

lec7-路由与路由器 1. 路由器硬件 路由器的硬件部分&#xff1a; 断电失去&#xff1a; RAM断电不失去&#xff1a;NVRAM&#xff0c; Flash&#xff0c; ROMinterface也算是一部分 路由器是特殊组件的计算机 console 口进行具体的调试 辅助口&#xff08;Auxiliary&…

HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级

注&#xff1a;本文为 “HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级” 相关文章合辑。 引文图片 csdn 转储异常&#xff0c;重传。 篇 1&#xff1a;Smart-Baby 回复中给出故障现象判断参考 篇 2、篇3 &#xff1a;HP 官方 BIOS 恢复、升级教程 开机黑屏&#xff0c…

代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础

图论基础 1、图的基本概念 二维坐标中&#xff0c;两点可以连成线&#xff0c;多个点连成的线就构成了图。 当然图也可以就一个节点&#xff0c;甚至没有节点&#xff08;空图&#xff09; 2、图的种类 整体上一般分为有向图和无向图&#xff1b; 有向图是指图中边是有方向的…

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中&#xff0c;弱指针&#xff08;TWeakPtr &#xff09;也是一种智能指针类型&#xff0c;主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下&#xff0c;提供一种可…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例&#xff0c;Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持&#xff0c;开发者只需在应用中添加相关依赖并配置必要的属性&#xff0c;Spring Boot 会自动配置所需的连…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…