mysql学习教程,从入门到精通,SQL处理重复数据(39)

news2024/10/10 20:12:47

1、SQL处理重复数据

使用GROUP BY和HAVING子句删除重复数据(以SQL Server为例)”的背景和原理的详细解释:

1.1、背景

在数据库管理中,数据重复是一个常见的问题。重复数据可能由于多种原因产生,如数据录入错误、数据同步问题或业务逻辑上的允许等。然而,在大多数情况下,重复数据是不希望存在的,因为它们可能导致数据不一致、查询性能下降以及数据分析错误等问题。
以SQL Server数据库为例,假设有一个名为test_table的表,该表用于存储某种类型的数据,其中包含一个tid字段作为唯一标识符(但在某些情况下,这个字段的值可能重复)。为了保持数据的准确性和一致性,需要删除这些重复的记录,只保留一条唯一的记录。

1.2、原理

  1. 识别重复数据

    首先,需要使用GROUP BY子句对tid字段进行分组,并使用HAVING子句过滤出那些出现次数大于1的组,即识别出重复的数据。这一步的目的是找到所有重复的tid值以及它们出现的次数。

    SELECT tid, COUNT(*) as duplicate_count  
    FROM test_table  
    GROUP BY tid  
    HAVING COUNT(*) > 1;
    

    在这个查询中,SELECT子句选择了tid字段和重复出现的次数(COUNT(*)),GROUP BY子句按tid字段对行进行分组,HAVING子句则过滤出那些分组后计数大于1的组。

  2. 删除重复数据

    一旦识别出重复的数据,就需要决定如何删除它们。在这个案例中,选择保留每个tid分组中tid值最小的一条记录(这通常是基于业务逻辑的选择,例如保留最早插入的记录)。

    为了实现这一点,可以使用一个公用表表达式(CTE)或子查询来为每个分组内的行分配一个唯一的行号(通常使用ROW_NUMBER()窗口函数)。然后,可以删除那些行号大于1的记录,因为它们是重复的。

    WITH CTE AS (  
        SELECT   
            *,  
            ROW_NUMBER() OVER (PARTITION BY tid ORDER BY (SELECT NULL)) as row_num  
        FROM test_table  
    )  
    DELETE FROM CTE  
    WHERE row_num > 1;
    

    在这个查询中,WITH子句定义了一个名为CTE的公用表表达式,它包含了原始表test_table的所有列以及一个额外的row_num列。ROW_NUMBER()窗口函数用于为每个tid分组内的行分配一个唯一的行号(由于ORDER BY (SELECT NULL),行号的分配顺序是任意的,但在这个案例中并不重要,因为我们只关心保留最小的tid值)。然后,DELETE语句从CTE中删除那些row_num大于1的记录,即删除了重复的记录。

综上所述,这个案例通过结合使用GROUP BYHAVINGROW_NUMBER()窗口函数等SQL技术,有效地识别并删除了数据库中的重复数据。这种方法不仅适用于SQL Server数据库,还可以在其他支持窗口函数的数据库系统中使用。

处理数据库中的重复数据是一个常见的任务,通常涉及识别、删除或更新这些重复记录。以下是一个示例,展示了如何使用SQL来识别和处理重复数据。假设我们有一个名为 users 的表,其中包含以下字段:id(主键)、email(可能重复)、namephone

步骤 1: 识别重复数据

首先,我们需要识别哪些 email 是重复的。这可以通过使用 GROUP BYHAVING 子句来实现。

SELECT email, COUNT(*) as duplicate_count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

步骤 2: 删除重复数据

在删除重复数据之前,我们需要决定保留哪一条记录。一种常见的方法是保留 id 最小的记录,因为 id 通常是自增的,可以认为是最早插入的记录。

  1. 创建一个临时表来存储需要保留的记录。
CREATE TEMPORARY TABLE temp_users AS
SELECT MIN(id) as id
FROM users
GROUP BY email;
  1. 使用 DELETE 语句删除不在临时表中的重复记录。
DELETE u
FROM users u
LEFT JOIN temp_users tu ON u.id = tu.id
WHERE tu.id IS NULL;
  1. 删除临时表(可选,因为临时表在会话结束时会自动删除)。
DROP TEMPORARY TABLE temp_users;

步骤 3: 验证结果

最后,验证是否成功删除了重复数据。

SELECT email, COUNT(*) as duplicate_count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

如果查询结果为空,则表示已成功删除所有重复数据。

替代方法:使用窗口函数(适用于支持窗口函数的数据库,如 PostgreSQL、MySQL 8.0+)

对于支持窗口函数的数据库,可以使用 ROW_NUMBER() 窗口函数来标记重复记录,并删除它们。

  1. 使用窗口函数标记重复记录。
WITH ranked_users AS (
    SELECT 
        id,
        email,
        name,
        phone,
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as row_num
    FROM users
)
DELETE FROM users
WHERE id IN (
    SELECT id
    FROM ranked_users
    WHERE row_num > 1
);

这种方法更加简洁,不需要创建临时表,并且可以直接在一条语句中完成删除操作。

注意事项

  • 在执行删除操作之前,务必备份数据,以防误删。
  • 根据实际情况选择保留哪一条记录(例如,根据 idcreated_at 时间戳等)。
  • 在生产环境中执行删除操作前,最好在测试环境中进行验证。

通过上述步骤,你可以有效地识别和处理数据库中的重复数据。

以下是一些使用SQL处理重复数据的具体案例,这些案例涵盖了不同的数据库和场景:

案例一:使用GROUP BY和HAVING子句删除重复数据(SQL Server)

假设有一个名为test_table的表,其中包含一个tid字段,该字段的值可能重复。

  1. 识别重复数据
SELECT tid, COUNT(*) as duplicate_count
FROM test_table
GROUP BY tid
HAVING COUNT(*) > 1;
  1. 删除重复数据(保留tid最小的一条记录):
WITH CTE AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY tid ORDER BY (SELECT NULL)) as row_num
    FROM test_table
)
DELETE FROM CTE
WHERE row_num > 1;

在这个案例中,ROW_NUMBER()窗口函数用于为每个tid分组内的行分配一个唯一的行号。然后,DELETE语句删除行号大于1的所有记录,即删除了重复的记录。

案例二:使用ctid删除重复数据(PostgreSQL)

假设有一个名为table_name的表,其中包含一个id字段,该字段的值可能重复。

  1. 删除重复数据(保留ctid最小的一条记录):
DELETE FROM table_name a
WHERE a.ctid = ANY(ARRAY(
    SELECT ctid
    FROM (
        SELECT ctid
        FROM table_name
        GROUP BY id
        HAVING COUNT(*) > 1
    ) a
    WHERE a.ctid <> MIN(ctid) OVER (PARTITION BY id)
));

在这个案例中,ctid是PostgreSQL内部为每一行分配的一个隐藏的系统列,表示行的物理位置。通过GROUP BYHAVING子句找到重复的行,并使用MIN(ctid) OVER (PARTITION BY id)找到每组中ctid最小的行。然后,DELETE语句删除不是最小ctid的所有记录。

案例三:使用DISTINCT和GROUP BY查找重复数据(MySQL)

假设有一个名为vitae的表,其中包含peopleIdseq两个字段,这两个字段的组合可能重复。

  1. 查找重复数据
SELECT peopleId, seq, COUNT(*) as duplicate_count
FROM vitae
GROUP BY peopleId, seq
HAVING COUNT(*) > 1;

在这个案例中,GROUP BY子句用于按peopleIdseq的组合对行进行分组,HAVING子句用于过滤出重复的行。

案例四:使用临时表删除重复数据(通用方法)

假设有一个名为users的表,其中包含可能重复的email字段。

  1. 创建临时表并插入不重复的数据
CREATE TEMPORARY TABLE temp_users AS
SELECT DISTINCT *
FROM users;
  1. 删除原表中的数据
DELETE FROM users;
  1. 将临时表中的数据复制回原表
INSERT INTO users
SELECT *
FROM temp_users;
  1. 删除临时表(可选,因为临时表在会话结束时会自动删除):
DROP TEMPORARY TABLE temp_users;

在这个案例中,通过创建一个临时表来存储不重复的数据,然后清空原表,并将临时表中的数据复制回原表,从而实现了删除重复数据的目的。
这些案例展示了如何使用SQL处理重复数据的不同方法。在实际应用中,应根据具体的数据库和场景选择合适的方法。同时,在执行删除操作之前,务必备份数据,以防误删。

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

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

相关文章

python+pytest+request 接口自动化测试

一、环境配置 1.安装python3 brew update brew install pyenv 然后在 .bash_profile 文件中添加 eval “$(pyenv init -)” pyenv install 3.5.3 -v pyenv rehash 安装完成后&#xff0c;更新数据库 pyenv versions 查看目前系统已安装的 Python 版本 pyenv global 3.5…

[实用工具]Docker安装nextcloud实现私有云服务和onlyoffice

Nextcloud是一款开源的云存储和协作平台&#xff0c;允许用户在自己的服务器上存储和访问文件&#xff0c;同时提供强大的协作工具。它可以替代商业云存储服务&#xff0c;让用户拥有完全控制和自主管理自己的数据。 Nextcloud支持文件上传和下载&#xff0c;可以通过Web界面、…

Android实现RecyclerView宽度变化动画

效果图 实现思路就是定义一个属性动画&#xff0c;在动画监听器中不断修改RecyclerView的宽度 valueAnimator ValueAnimator.ofInt(begin, recyclerView.getWidth() * 2);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {Overridepublic void …

EasyAnimate

https://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.mdhttps://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.md EasyAnimate v4是一个用于生成高分辨率和长视频的端到端解决方案。我们可以训练基于转换器的扩散生成器,训练用于处理长视频的VAE,…

python35_控制台简单计算年薪

控制台简单计算年薪 def calculate_annual_salary(monthly_salaries):"""计算年薪。参数:monthly_salaries: list of float&#xff0c;每个月的工资列表。返回值:float&#xff0c;用户的年薪。"""annual_salary sum(monthly_salaries)return…

论文作者署名排序是怎么界定的?

人人都想在论文的作者名单中占个位子&#xff0c;特别是一作和通讯作者&#xff0c;我也经常会收到一些人的哭诉&#xff0c;说自己明明做了大部分的工作&#xff0c;但却让别人的名字挂在第一作者。 在厘清一作与通讯作者的意义之前&#xff0c;我们先来看看谁可以署名。目前国…

经典蓝牙BLE版本区别:【图文讲解】

蓝牙是一种短距的无线通讯技术&#xff0c;可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙&#xff0c;而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙&#xff08;BLE&#xff09;。 1&#xff1a;蓝牙4.0 BLE 4.0版本是3.0版本的升级版本&a…

MySQL 初探:从基础到优化

什么是 MySQL&#xff1f; MySQL 是一个开源的关系型数据库管理系统 (RDBMS)&#xff0c;使用结构化查询语言 (SQL) 进行数据管理。作为最流行的数据库之一&#xff0c;MySQL 被广泛应用于各类网站和应用中&#xff0c;从小型应用到大型复杂系统。 MySQL 的特点 开源免费&am…

antdv树形表格 大量tooltip等组件导致页面卡顿问题优化

vue3、ant-design-vue 4.2.3 遇到的问题&#xff1a;页面中有个展示树形数据的表格&#xff0c;默认需要全部展开&#xff0c;有一组数据量较大时页面首次渲染时非常卡顿&#xff0c;发现每次都大概用了7、8秒才完成渲染。表格展开的数据大概300条数据&#xff0c;操作列中有5…

SpringBoot框架下的服装生产管理系统

1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高…

leetcode:反转字符串中的单词III

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseWords(string s) {string s1; int i 0; int j 0; int length s.length(); for (i …

2024年【金属非金属矿山(地下矿山)安全管理人员】复审考试及金属非金属矿山(地下矿山)安全管理人员在线考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员复审考试考前必练&#xff01;安全生产模拟考试一点通每个月更新金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员在线考试题目及答案&#…

防汛可视化系统:提升应急响应能力

通过图扑可视化系统实时监测水情、雨情和地理数据&#xff0c;辅助防汛决策与调度&#xff0c;提供直观的风险预警信息&#xff0c;从而优化资源分配&#xff0c;提高防汛应急响应效率。

进程通讯方式区别(从不同角度看)

*常用到的不同主机间进程通讯&#xff1a;Socket。比如&#xff1a;host和引擎间socket指令通讯、分派和复判之间指令通讯&#xff1b; *共享内存&#xff1a;在Windows系统中&#xff0c;共享内存的实现通常有以下几种方式&#xff1a; 1.内存映射文件(最常用)&#xff1a;(…

linux上的smb共享文件夹

需求描述 公司的打印机使用扫描功能的时候&#xff0c;需要发送大量文件。然鹅公司的电脑都是加入了AzureAD的&#xff0c;不能在公司电脑上简单设置共享。好在公司有很多阿里云上的服务器&#xff0c;Linux和Windows的都有&#xff0c;所以就来尝试用阿里云的服务器来进行smb…

正点原子学习笔记之汇编LED驱动实验

1 汇编LED原理分析 为什么要写汇编     需要用汇编初始化一些SOC外设     使用汇编初始化DDR、I.MX6U不需要     设置sp指针&#xff0c;一般指向DDR&#xff0c;设置好C语言运行环境 1.1 LED硬件分析 可以看到LED灯一端接高电平&#xff0c;一端连接了GPIO_3上面…

华捷艾米3D结构光模组测试

1.测试项目总览 本次测试主要测试以下几个方面&#xff1a; 模组的基本属性和SDK基本功能&#xff1b;华捷艾米提供的人脸防伪算法性能&#xff1b;模组的逆光性能。 2.基本属性和SDK基本功能 图像属性&#xff1a; 模组提供的3d深度数据标称分辨率最大为640x480&#xff0…

软件测试学习笔记丨MongoDB

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32359 一、MangoDB数据库 1.1 关系与非关系 1.1.1 关系型数据库 关系型数据库 MySQL&#xff0c;Oracle&#xff0c; SQLServer&#xff0c; Access…SQL&#xff08;结构化查询语句&#x…

[图形学]smallpt代码详解(上)

一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍&#xff0c;和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…

微信服务号灰度测试折叠,看谁该慌了?

2024年国庆节前夕&#xff0c;突然发现我的微信的会话列表清静了不少。 紧接着&#xff0c;我马上就慌了... &#x1f914;怎么“丰巢快递”不见了&#xff0c;我要找取件码 &#x1f914;我的flomo浮墨笔记公众号呢&#xff1f;我要记笔记啊 &#x1f914;这个月怎么没有…