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

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

本文将探讨如何在 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.mzph.cn/pingmian/66192.shtml

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

相关文章

综合能源建模:理论、方法与实践

一、引言 随着全球能源需求的持续增长以及对能源安全、环境保护和可持续性发展的日益关注&#xff0c;综合能源系统&#xff08;Integrated Energy System&#xff0c;IES&#xff09;作为一种能够整合多种能源资源、实现能源高效利用和协同优化的解决方案&#xff0c;正逐渐成…

【Leetcode 热题 100】74. 搜索二维矩阵

问题背景 给你一个满足下述两条属性的 m n m \times n mn 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 t a r g e t target target&#xff0c;如果 t a r g e t target target 在矩阵中&…

DOS攻击的原理和实现 (网络安全)hping3和Slowloris的运用

DoS攻击的原理和实现 DoS攻击&#xff08;Denial of Service Attack&#xff0c;拒绝服务攻击&#xff09;是指通过恶意手段使目标服务器、服务或网络资源无法正常提供服务&#xff0c;从而影响正常用户的访问。DoS攻击通常通过消耗目标系统的资源&#xff08;如带宽、内存、处…

Elasticsearch与数据库数据一致性:最佳实践与解决方案

在现代应用程序中&#xff0c;Elasticsearch&#xff08;ES&#xff09;作为一个高效的分布式搜索引擎&#xff0c;常常与数据库一同使用&#xff0c;以提供强大的搜索、分析和数据可视化功能。然而&#xff0c;数据库和Elasticsearch之间的同步与一致性常常成为一个挑战。如何…

jquery实现的网页版扫雷小游戏源码

源码介绍 这是一款基于jQuery实现的经典扫雷小游戏源码&#xff0c;玩家根据游戏规则进行游戏&#xff0c;末尾再在确定的地雷位置单击右键安插上小红旗即可赢得游戏&#xff01;是一款非常经典的jQuery游戏代码。本源码改进了获胜之后的读数暂停功能。 效果预览 源码下载 j…

接口隔离原则,到底什么需要隔离?

接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09;是SOLID五大设计原则之一&#xff0c;其核心思想是&#xff1a;客户端不应该被迫依赖于它不使用的方法&#xff1b;接口应当尽量小而专一&#xff0c;避免创建“胖”接口&#xff08;即一个接口中定义…

对计网大题的一些指正(中间介绍一下CDM的原理和应用)

目录 前言&#xff1a; &#xff08;1&#xff09;五层原理体系结构每层功能&#xff1a; 下面是文档的答案&#xff1a; 我在之前的博客里面有介绍过五层原理体系结构&#xff0c; 按理来说&#xff0c;第五层应该是应用层才对&#xff0c;而会话层的功能应该被放到应用层…

Arduino UNO 驱动1.8 TFT屏幕显示中文

背景 最近入手了一块1.8寸的tft屏幕&#xff0c;通过学习文档&#xff0c;已经掌握了接线&#xff0c;显示英文、数字、矩形区域、划线、画点等操作&#xff0c; 但是想显示中文的时候操作比较复杂。 问题 1、arduino uno 驱动这款屏幕目前使的是自带的<TFT.h> 库操作…

【论文阅读】Anchor-based fast spectral ensemble clustering

论文地址&#xff1a;Anchor-based fast spectral ensemble clustering - ScienceDirect 代码地址&#xff1a; 摘要 集成聚类通过融合多个基础聚类方法&#xff0c;可以获得更好且更稳健的结果&#xff0c;因此受到广泛关注。尽管近年来已经出现了许多代表性的算法&#xff…

R语言的数据结构

R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言&#xff0c;因其强大的数据处理能力而受到广泛欢迎。在R中&#xff0c;数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构&#xff0c;包括向量、矩阵、数据框、列表、因子等&…

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313 Github地址&#xff1a;https://github.com/CraftJarvis/RAT 想象一下&#xff0c;一个人工智能助手可以像莎士比亚一样写作&#xff0c;像专家一样推理。这听起来很了不起&#xff0c;对吧&#xff1f;但是&#xff0…

关于数组的一些应用--------数组作函数的返回值(斐波那契数列数列的实现)

数组在作为函数的返回值&#xff0c;一个很经典的例子就是获取斐波那契数列的前N项 代码思路&#xff1a; 设计思路 输入&#xff1a; 输入一个整数 n&#xff0c;表示要生成斐波那契数列的长度。 输出&#xff1a; 输出一个长度为 n 的整数数组&#xff0c;其中每个元素为斐…

【IT人物系列】之MySQL创始人

前言 当今世界有无数的人构成&#xff0c;其中有些人做了一些改变世界的事情&#xff0c;比如&#xff1a;乔布斯缔造了Apple帝国&#xff0c;‌詹姆斯高斯林创造了Java语言等。正是这些优秀的人做的这些优秀的事情&#xff0c;让这个世界更加美好。因此他们值得铭记。 从今天…

【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

pytorch镜像源

我以为的 pip install torch2.3.1cu118 torchvision0.18.1cu118 torchaudio2.3.1cu118 -f https://download.pytorch.org/whl/torch_stable.html实际上&#xff0c;有很多加速方案 为提高下载速度可以使用国内的镜像源来安装与 CUDA 11.8 兼容的 PyTorch。 方法 1&#xff1a…

047_小驰私房菜_Qcom 8系列,Jpeg GPU 旋转

【问题背景】 横屏模式下&#xff0c;发现有些三方app拍照旋转了90度。 【修改策略】 adb shell setprop endor.debug.camera.overrideGPURotationUsecase 1 或者在/vendor/etc/camera/camxoverridesettings.txt 里面添加如下内容 overrideGPURotationUsecase1 【解释】 Ga…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了&#xff08;具体哪些是必须的&#xff0c;哪些是多余的没验证&#xff09;&#xff0c;configure才能认为X的库文件和头文件是可以用的 ./configure --prefixpwd/mybuild \--x-includes/path/to/X11/m…

Go语言性能优化-字符串格式化优化

在 Go 语言中,格式化字符串(例如使用 fmt.Sprintf、fmt.Printf 等函数)确实可能对性能产生影响,尤其是当频繁执行格式化操作时。格式化字符串涉及对格式符的解析和数据类型的转换,这会增加额外的开销。为了减少格式化字符串带来的性能影响,可以采取以下一些优化策略: 1…

LSP介绍并实现语言服务

首发于Enaium的个人博客 LSP (Language Server Protocol) 介绍 前段时间我为Jimmer DTO实现了一个 LSP 的语言服务&#xff0c;这是我第一次实现 LSP&#xff0c;所以在这里我分享一下我实现LSP的经验。 首先来看一下效果&#xff0c;图片太多&#xff0c;我就放一部分&#…

谷粒商城项目125-spring整合high-level-client

新年快乐! 致2025年还在努力学习的你! 你已经很努力了&#xff0c;今晚就让自己好好休息一晚吧! 在后端中选用哪种elasticsearch客户端&#xff1f; elasticsearch可以通过9200或者9300端口进行操作 1&#xff09;9300&#xff1a;TCP spring-data-elasticsearch:transport-…