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基本使用和简单的CRUD操作
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
mybatis调用sqlserver存储过程返回结果集的方法
May 08 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
数据库之SQL技巧整理案例
Jul 07 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
MSSQL基本语法操作
Apr 11 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
PHP中防止SQL注入实现代码
2011/02/19 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
简明 Python 基础学习教程
2007/02/08 Python
Python中的getopt函数使用详解
2015/07/28 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python有序字典简单实现方法示例
2017/09/28 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Python中的With语句的使用及原理
2020/07/29 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
运动会稿件200字
2014/02/07 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
国庆阅兵观后感
2015/06/15 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
Pygame Draw绘图函数的具体使用
2021/11/17 Python