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 相关文章推荐
SQLServer2019 数据库环境搭建与使用的实现
Apr 08 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server中搜索特定的对象
May 25 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
基于mysql的论坛(3)
2006/10/09 PHP
PHP 动态随机生成验证码类代码
2010/04/09 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
python SVM 线性分类模型的实现
2019/07/19 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
新东网科技Java笔试题
2012/07/13 面试题
策划创业计划书
2014/02/06 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
Echarts如何重新渲染实例详解
2022/05/30 Javascript