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
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
详解SQL报错盲注
Jul 23 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 柱状图实现代码
2009/12/04 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
ReactRouter的实现方法
2021/01/25 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
教师评优事迹材料
2014/01/10 职场文书
揠苗助长教学反思
2014/02/04 职场文书
教师现实表现材料
2014/02/14 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
资产运营委托书范本
2014/10/16 职场文书
营运督导岗位职责
2015/04/10 职场文书