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 相关文章推荐
SQLServer2019 数据库的基本使用之图形化界面操作的实现
Apr 08 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
SQL SERVER存储过程用法详解
Feb 24 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server携程核心系统无感迁移到MySQL实战
Jun 01 SQL Server
SqlServer常用函数及时间处理小结
May 08 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jQuery each()方法的使用方法
2010/03/18 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
Express.JS使用详解
2014/07/17 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
浅谈js获取ModelAndView值的问题
2018/03/28 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
Python的Django框架使用入门指引
2015/04/15 Python
python实现给数组按片赋值的方法
2015/07/28 Python
Python 爬虫的工具列表大全
2016/01/31 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
python使用mysql数据库示例代码
2017/05/21 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
Django继承自带user表并重写的例子
2019/11/18 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
在keras中实现查看其训练loss值
2020/06/16 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
《槐乡五月》教学反思
2014/04/25 职场文书
四风问题对照检查材料
2014/09/22 职场文书
小学生通知书评语
2014/12/31 职场文书
运动会加油稿30字
2015/07/21 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript