一次SQL如何查重,去重小记

简介: 一次SQL如何查重,去重小记


前言

在使用SQL提数的时候,常会遇到表内有重复值的时候,就需要做去重,本文归类了常用方法。


⛳️ 1.distinct

题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据


示例:user_profile

image.png

mysql>SELECT DISTINCT university FROM user_profile;

🚩🚩根据示例,查询返回以下结果

image.png

🚩🚩小贴士:

SQL中关键词distinct去重:

英语中distinct 代表独一无二的意思,

他在SQL表示去重的意思:比如本题中university这一列出现了两次北京大学,

使用distinct进行去重查询后,则北京大学只出现一次。

distinct 通常效率较低

distinct 使用中,放在 select 后边,对后面所有的字段的值统一进行去重

🌈🌈 拓展:

题目:现在运营需要查看用户的总数

select count(distinct university) from user_profile;


⛳️ 2.group by

🚩🚩 举个栗子,现有这样一张表 task

image.png

备注:

task_id: 任务id;

order_id: 订单id;

start_time: 开始时间

注意:一个任务对应多条订单


题目:列出任务总数

🚩🚩🚩🚩根据示例,查询方法如下:

第1步:列出 task_id 的所有唯一值(去重后的记录,null也是值)

select task_id

from Task

group by task_id;

第二步: 任务总数

select count(task_id) task_num

from (select task_id

from Task

group by task_id) tmp;


⛳️ 3.row_number 窗口函数


🚩🚩 举个栗子,现有这样一张表 task

image.png

备注:

task_id: 任务id;

order_id: 订单id;

start_time: 开始时间

注意:一个任务对应多条订单


题目:查询整个表重复的数据

🚩🚩根据示例,查询方法如下:

– 在支持窗口函数的 sql 中使用

select count(case when rn=1 then task_id else null end) task_num

from (select task_id

, row_number() over (partition by task_id order by start_time) rn

from Task) tmp;


🚩🚩小贴士:


MySQL8.0 中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三个窗口函数来实现排序

需要注意的一点是 as 后的别名,千万不要与前面的函数名重名,否则会报错

下面给出这三种函数实现排名的案例:

–三条语句对于上面三种排名

select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;

select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;

select xuehao,score, RANK() over(order by score desc) as r from scores_tb;

– 一条语句也可以查询出不同排名

SELECT xuehao,score,

ROW_NUMBER() OVER w AS ‘row_r’,

DENSE_RANK() OVER w AS ‘dense_r’,

RANK() OVER w AS ‘r’

FROM scores_tb

WINDOW w AS (ORDER BY score desc);


⛳️ 4.删除重复数据


创建测试数据

我们创建一个人员信息表并在里面插入一些重复的数据

CREATE TABLE Person(

id int auto_increment primary key comment ‘主键’,

Name VARCHAR(20) NULL,

Age INT NULL,

Address VARCHAR(20) NULL,

Sex CHAR(2) NULL

);

INSERT INTO Person(ID,Name,Age,Address,Sex)

VALUES

( 1, ‘张三’, 18, ‘北京路18号’, ‘男’ ),

( 2, ‘李四’, 19, ‘北京路29号’, ‘男’ ),

( 3, ‘王五’, 19, ‘南京路11号’, ‘女’ ),

( 4, ‘张三’, 18, ‘北京路18号’, ‘男’ ),

( 5, ‘李四’, 19, ‘北京路29号’, ‘男’ ),

( 6, ‘张三’, 18, ‘北京路18号’, ‘男’ ),

( 7, ‘王五’, 19, ‘南京路11号’, ‘女’ ),

( 8, ‘马六’, 18, ‘南京路19号’, ‘女’ );


image.png

题目:数据库中存在重复记录,删除保留其中一条

我们发现除了自增长ID不同以为,有几条其他字段都重复的数据出现


🐴 第一步:找出重复的数据


mysql>SELECT MAX(ID) ID,

Name,Age,Address,Sex

FROM Person

GROUP BY Name,Age,Address,Sex

HAVING COUNT(1)>1

image.png


🚩🚩小贴士:


HAVING将分组后统计出来的数量大于1的数据行,就是我们要找的重复数据

上面用Max函数或者Min函数均可,只是为了保证取出来的数据的唯一性。

🐴 第二步:删除重复的数据


其实我们数据库中最后要保留的结果就是第二步中查询出来的数据,

我们把其他的数据删除即可。

怎么删除呢?我们使用ID来排除。

DELETE FROM Person
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sex
FROM Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1) T
WHERE Person.Name=T.Name
AND Person.Age=T.Age
AND Person.Address=T.Address
AND Person.Sex=T.Sex
AND Person.ID<T.ID
)

执行完后重新查询Person表结果如下

马六因为只有一条记录,所以没有参与去重,直接显示。

image.png


⛳️ 5.如何成为SQL高手


https://blog.csdn.net/weixin_41645135/category_11653817.html

image.png

目录
相关文章
|
4天前
|
SQL 存储 缓存
Flink SQL Deduplication 去重以及如何获取最新状态操作
Flink SQL Deduplication 是一种高效的数据去重功能,支持多种数据类型和灵活的配置选项。它通过哈希表、时间窗口和状态管理等技术实现去重,适用于流处理和批处理场景。本文介绍了其特性、原理、实际案例及源码分析,帮助读者更好地理解和应用这一功能。
53 14
|
7月前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
145 0
|
7月前
|
SQL 存储 分布式计算
奇思妙想的SQL|去重Cube计算优化新思路
本文主要分享了作者在蚂蚁集团高管数据链路改造升级过程中,针对去重Cube的优化实践。
846 48
|
5月前
|
SQL 数据库
【SQL】已解决:SQL分组去重并合并相同数据
【SQL】已解决:SQL分组去重并合并相同数据
100 1
|
SQL
Sql去重查询数据
Sql去重查询数据
128 0
|
SQL 移动开发 BI
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
怎样对数据组合重新排列并去重的问题、通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。本篇文章主要介绍的两个方面,第一个方面曾经有好几个网友和同事问我,第二个问题真的是很多同行的通病,认为分析函数是万金油,一股脑用。
【SQL开发实战技巧】系列(二十三):数仓报表场景☞ 如何对数据排列组合去重以及通过如何找到包含最大值和最小值的记录这个问题再次用执行计划给你证明分析函数性能不一定高
|
SQL 前端开发 Java
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
|
SQL 流计算
Flink SQL 功能解密系列 —— 数据去重的技巧和思考
去重逻辑在业务处理中使用广泛,大致可以分两类:DISTINCT去重和FIRST_VALUE主键去重,两者的区别是DISTINCT去重是对整行数据进行去重,比如tt里面数据可能会有重复,我们要去掉重复的数据;FIRST_VALUE是根据主键进行去重,可以看成是一种业务层面的去重,但是真实的业务场景使用也很普遍,比如一个用户有多次点击,业务上只需要取第一条。
|
SQL 数据库
数据库sql去重操作 + 人大金仓案例
一般在增量导入数据后,表中会出现冗余的数据,因此对于表的去重操作主要分为两种:去重查询以及删除重复数据
基础查询 SQL3查询结果去重&&SQL4查询结果限制返回行数&&SQL5将查询后的列重新命名
基础查询 SQL3查询结果去重&&SQL4查询结果限制返回行数&&SQL5将查询后的列重新命名
183 0
基础查询 SQL3查询结果去重&&SQL4查询结果限制返回行数&&SQL5将查询后的列重新命名
下一篇
DataWorks