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 相关文章推荐
2021-4-3课程——SQL Server查询【2】
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 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中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
JavaScript中调用函数的4种方式代码实例
2015/07/08 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
基于Python的身份证号码自动生成程序
2014/08/15 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Python实现简单的列表冒泡排序和反转列表操作示例
2019/07/10 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
详解Python yaml模块
2020/09/23 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
农村党支部先进事迹
2014/01/14 职场文书
父亲八十大寿答谢词
2014/01/23 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL