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 22 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SqlServer常用函数及时间处理小结
May 08 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/10/09 PHP
php实现读取内存顺序号
2015/03/29 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python的log日志功能及设置方法
2019/07/11 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
Python读写压缩文件的方法
2020/07/30 Python
python数据抓取3种方法总结
2021/02/07 Python
家居设计专业个人自荐信范文
2013/11/26 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
七年级作文之秋游
2019/10/21 职场文书
python中if和elif的区别介绍
2021/11/07 Python
golang语言指针操作
2022/04/14 Golang
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技
box-shadow单边阴影的实现
2023/05/21 HTML / CSS