SQL中的三种去重方法小结


Posted in SQL Server onNovember 01, 2021

在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。
在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。

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

 

task_id order_id start_time
1 123 2020-01-05
1 213 2020-01-06
1 321 2020-01-07
2 456 2020-01-06
2 465 2020-01-07
3 798 2020-01-06

备注:

  • task_id: 任务id;
  • order_id: 订单id;
  • start_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;

此外,再借助一个表 test 来理理 distinct 和 group by 在去重中的使用:

 

user_id user_type
1 1
1 2
2 1
-- 下方的分号;用来分隔行
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中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)

到此这篇关于SQL中的三种去重方法小结的文章就介绍到这了,更多相关SQL 去重内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
Sql-Server数据库单表查询 4.3实验课
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server删除表中的重复数据
May 25 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SQL Server表分区删除详情
Spark SQL 2.4.8 操作 Dataframe的两种方式
Windows环境下实现批量执行Sql文件
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 #SQL Server
sql server删除前1000行数据的方法实例
Aug 30 #SQL Server
SQLServer之常用函数总结详解
Aug 30 #SQL Server
SQL写法--行行比较
Aug 23 #SQL Server
You might like
谈谈新手如何学习PHP
2006/12/23 PHP
php防攻击代码升级版
2010/12/29 PHP
浅析PHP绘图技术
2013/07/03 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
Angularjs 设置全局变量的方法总结
2016/10/20 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python多重继承实例
2014/10/11 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
传播学专业毕业生自荐信
2013/11/04 职场文书
机修工工作职责
2014/02/21 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
jquery插件实现悬浮的菜单
2021/04/24 jQuery