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 07 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server中搜索特定的对象
May 25 SQL Server
SQL Server2019安装的详细步骤实战记录(亲测可用)
Jun 10 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
mysql 字段类型说明
2007/04/27 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
Python实现的彩票机选器实例
2015/06/17 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
python字符串查找函数的用法详解
2019/07/08 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
机关道德讲堂实施方案
2014/03/15 职场文书
房屋授权委托书范本
2014/10/07 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
800字作文之大雪
2019/12/04 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript