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作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 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制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
利用python求相邻数的方法示例
2017/08/18 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
点球小游戏python脚本
2018/05/22 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
pandas分组聚合详解
2020/04/10 Python
python 下划线的不同用法
2020/10/24 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
浅谈html5 响应式布局
2014/12/24 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
行政助理岗位职责范文
2013/12/03 职场文书
施工安全责任书
2014/04/14 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
小学大队委竞选口号
2015/12/25 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
Java无向树分析 实现最小高度树
2022/04/09 Javascript