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-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer2019 数据库环境搭建与使用的实现
Apr 08 SQL Server
SQL Server表分区删除详情
Oct 16 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 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的知识
2006/11/17 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
Python实现的简单模板引擎功能示例
2017/09/02 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
社区道德讲堂实施方案
2014/03/21 职场文书
个人函授自我鉴定
2014/03/25 职场文书
快递员岗位职责
2014/09/12 职场文书
十七岁的单车观后感
2015/06/12 职场文书
oracle数据库去除重复数据
2022/05/20 Oracle