泪伤荡的编程指南 泪伤荡的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
  • 基础篇

    • 数据库基础知识小结
    • NoSQL基础知识小结
    • 字符集详解
  • Mysql

    • MySQL基础小结
    • 索引篇
    • 思维导图
    • 数据库优化
    • 临时表
    • 实战篇

      • 日常小记
      • JOIN 解析
      • 执行计划解析
      • 内置函数小记
      • JSON字段处理
      • 时间字段的处理
      • 一文教你如何删除重复记录
      • exists语法解析
    • 读高性能MySQL笔记

      • MySQL架构
  • 达梦DM

    • DM基础入门
    • DM数据类型
    • DM_SQL语言支持的表达式
    • DM表结构修改
  • Redis

    • Redis总结
    • Redis小记
  • 数据库
  • Mysql
  • 实战篇
泪伤荡
2024-08-31

一文教你如何删除重复记录

# 一文教你如何删除重复记录

场景分析:

  • 现以用户表(t_user)为例,uid 和 id 为表中的某个字段。
  • uid 是表中的唯一字段,但是因为之前没有加唯一索引,导致内部出现 uid 重复的数据。
  • 现在需要加唯一索引,但是需要先删除表中多余的重复的脏数据。

SQL 示例:

以下是一个删除重复记录的示例 SQL 语句,它将为每个 uid 保留具有最小 id 值的记录

DELETE
FROM t_user
WHERE id IN (SELECT id
              FROM (SELECT id, uid,
                           ROW_NUMBER() OVER (PARTITION BY uid ORDER BY id) AS row_num
                    FROM t_user) AS ranked
              WHERE row_num > 1);
1
2
3
4
5
6
7

示例解析:

在这个例子中,内部查询首先为每个 uid 分组内的记录分配了一个行号(row_num),根据 id 字段排序,其中最小的 id 值对应行号1。然后,外层的 IN 子句用来选择那些行号大于 1 的记录,即重复的记录。最后,DELETE 语句根据 id 删除这些记录。

语法解析:

ROW_NUMBER() OVER (PARTITION BY uid ORDER BY id) AS row_num 是 SQL 中的一个窗口函数(window function)的语法。窗口函数用于在不失去分组的情况下,对分组内的数据进行计算。

这里是 ROW_NUMBER() 函数的具体用法:

  1. ROW_NUMBER(): 这是一个窗口函数,它会为结果集中的每一行分配一个唯一的序号,序号的分配是连续的,从1开始,不管中间是否有空缺。
  2. OVER: 这个关键字用来指定窗口函数的参数,即定义窗口函数的作用域和排序的顺序。
  3. PARTITION BY uid: 这个子句定义了窗口函数的分区依据。在这里,PARTITION BY 将结果集按照 uid 字段的值进行分组。对于每个 uid 分区,ROW_NUMBER() 都会重新从1开始计数。
  4. ORDER BY id: 这个子句定义了窗口函数内部的排序规则。在这里,它指定了在每个 uid 分区内部,行应该根据 id 字段的值进行升序排序。如果有多条记录具有相同的 id,它们的行号可能会是相同的。
  5. AS row_num: 这是给窗口函数的结果指定一个别名,方便在查询的其他部分引用。在这里,行号被命名为 row_num。

整个表达式的作用是:对于表 t_user 中的每条记录,根据 uid 进行分组,并在每个分组内根据 id 的升序排列,为每条记录分配一个唯一的行号。

这种语法在处理如去重、分组排序等复杂查询时非常有用。例如,你可以使用这个行号来删除每个 uid 分组内的重复记录,只保留具有最小 id 的记录。

上次更新: 2024/10/26 02:01:17
时间字段的处理
exists语法解析

← 时间字段的处理 exists语法解析→

Theme by Vdoing | Copyright © 2024-2025 泪伤荡 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式