SQL去重的三种方法汇总
创作时间:
作者:
@小白创作中心
SQL去重的三种方法汇总
引用
CSDN
1.
https://blog.csdn.net/u012955829/article/details/139457418
在使用SQL进行数据查询时,经常会遇到需要去除重复值的情况,比如计算独立访客(UV)时就需要对数据进行去重处理。在MySQL中,通常使用
distinct或group by子句来实现去重,而在支持窗口函数的SQL(如Hive SQL、Oracle等)中,还可以使用row_number窗口函数进行去重。本文将详细介绍这三种去重方法。
假设有一张名为task的表,结构如下:
其中:
task_id:任务IDorder_id:订单IDstart_time:开始时间
注意:一个任务可能对应多条订单记录。我们需要求出任务的总数量,但由于task_id并非唯一,因此需要进行去重处理。
distinct方法
-- 列出所有唯一的task_id值(去重后的记录)
-- select distinct task_id
-- from Task;
-- 任务总数
select count(distinct task_id) task_num
from Task;
distinct通常效率较低,不适合用来展示去重后的具体值,一般与count配合使用来计算条数。使用时,distinct放在select后,对后面所有字段的值进行统一去重。例如,如果distinct后面有两个字段,那么1,1和1,2这两条记录不会被视为重复值。
group by方法
-- 列出所有唯一的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;
row_number窗口函数方法
row_number是窗口函数,其语法如下:row_number() over (partition by <用于分组的字段名> order by <用于组内排序的字段名>)
其中partition by部分可以省略。
-- 在支持窗口函数的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;
为了更好地理解distinct和group by在去重中的使用,我们再借助一张名为test的表进行说明:
-- 下方的分号;用来分隔行
select distinct user_id
from Test; -- 返回 1; 2
select distinct user_id, user_type
from Test; -- 返回1, 1; 1, 2; 2, 1
select user_id
from Test
group by user_id; -- 返回1; 2
select user_id, user_type
from Test
group by user_id, user_type; -- 返回1, 1; 1, 2; 2, 1
select user_id, user_type
from Test
group by user_id;
-- Hive、Oracle等会报错,mysql可以这样写。
-- 返回1, 1 或 1, 2 ; 2, 1(共两行)。只会对group by后面的字段去重,就是说最后返回的记录数等于上一段sql的记录数,即2条
-- 没有放在group by 后面但是在select中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)
通过这些示例,我们可以清晰地看到distinct和group by在去重时的具体行为和差异。
热门推荐
智慧养殖的发展现状:从初创到智能化时代
考研数学真题合集|1980-2024年考研数一二三历年真题及答案解析
君王想“泰山封禅”究竟多难?为何历史上只有六位皇帝获此殊荣?
铁皮石斛的功能主要治什么病
“人之初,性本善 or 性本恶”?数千年来思想家的争论,科学家怎么看?
雨刮器保养指南:结构原理、日常维护到产品选购全攻略
维生素E缺乏有哪些症状
脚后跟疼怎么解决
小孩不自觉翻白眼是怎么回事
塑料模具成型工艺的对比:注塑与热成型的较量
个人所得税扣缴端如何进行数据备份和恢复?
合肥净化工程:洁净室洁净度有哪几个级别?
记账错误时的更正方法
深入解析LLM大模型精度问题:FP16、FP32与BF16的应用与实践
全网首发|《人形机器人治理导则》
建筑学和气候学跨学科发展与融合的新机遇
长护险如何申请,需要哪些材料和流程?
买到过期食品怎么举报投诉
ESP8266+MPU6050 实现运动姿态检测
5G时代已来,广电行业做了哪些布局探索?
小腿肌间静脉血栓怎么治疗
盘点“哪吒”现象背后的东方热:以科技为媒,传统文化再次焕新表达
贷款逾期前银行有没有责任提醒借款人?
股票交易成功率的影响因素有哪些?如何提高股票跟买的成功率?
护士长管理能力的培养
科创板企业上市要求解析
如何在线开设科创板交易账户
南京中医药大学2024年考研调剂信息 附历年非全日制研究生调剂专业
自汗与盗汗的区别是什么
西兰花与甲状腺肿大的真相:这些食用注意事项要知道