SQL 中去重的三种方法
点击关注上方“逆锋起笔”,
设为“置顶或星标”,第一时间送达干货
blog.csdn.net/xienan_ds_zj/article/details/103869048
作者:程序员的成长之路
SQL去重是数据分析工作中比较常见的一个场景,今天给大家具体介绍3种去重的方法。
在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。
在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。
举个栗子,现有这样一张表 task:
备注:
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_idfrom Taskgroup 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) rnfrom Task) tmp;
此外,再借助一个表 test 来理理 distinct 和 group by 在去重中的使用:
-- 下方的分号;用来分隔行
select distinct user_id
from Test; -- 返回 1; 2select distinct user_id, user_type
from Test; -- 返回1, 1; 1, 2; 2, 1select user_id
from Test
group by user_id; -- 返回1; 2select user_id, user_type
from Test
group by user_id, user_type; -- 返回1, 1; 1, 2; 2, 1select 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中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)
逆锋起笔
是一个专注于程序员圈子的技术平台,你可以收获最新技术动态
、最新内测资格
、BAT等大厂的经验
、精品学习资料
、职业路线
、副业思维
,微信搜索逆锋起笔
关注!
又一本 Python 可视化好书来了!
GitHub 人脸属性编辑神器横空出世!
代码生成器用起来,是真的爽~
一次完整的 Http 请求过程
一本免费的深度学习漫画书
更多精彩内容,请关注「数据前线」
记得点「赞」和「在看」
爱你们
SQL 中去重的三种方法相关推荐
- SQL中去重的三种方法,还有谁不会?
来自:CSDN,作者:米竹 链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048 SQL去重是数据分析工作中比较常见的一个场景 ...
- SQL中累加的三种方法
之前给小伙伴们介绍了三种去重的方法,虽然不能留言,但是看到大家的点赞和在看数都比较多,今天再给大家分享一下三种累加的方法. 有如下表ADD_NUM 我们希望实现如下结果: 开窗函数学过开窗函数的小伙伴 ...
- SQL去重的三种方法汇总
SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...
- PHP中删除目录的三种方法
原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...
- OpenCV精进之路(零):访问图像中像素的三种方法
访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...
- 在MATLAB中生成矩阵的三种方法
在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- java定时执行某个方法_Java中定时执行任务的三种方法
Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...
- JAVA 通过value获取Map中key的三种方法
JAVA 通过value获取Map中key的三种方法 简介 方法描述 循环法 Stream方法 Apache Commons Collections的BidiMap 总结 简介 我们都知道Map是存放 ...
最新文章
- python批量读取csv文件-使用Python读写csv文件的三种方法
- 试除法的妙用【O(√N) 复杂度】
- python alpha_如何用Python打造一个简易版的Alpha GO?
- 树莓派利用Django搭建聊天网页服务器 —— 准备篇
- 人体轮廓_人体艺术:赏世界著名的女人体油画:身体轮廓
- json和python中字典的区别和联系_Python中 json字符串和字典的区别
- 滴滴与比亚迪合作的无人车亮相:搭载6颗摄像头
- python输入姓名年龄输出年龄最大的_输入姓名打印年龄练习
- 中文信息处理——语料划分测试集与训练集
- ExtJs之工具栏及菜单栏
- UNIX 环境高级编程(四)—— dirent.h
- 删除60天之前的elasticsearch索引
- C++ const,static,inline
- 【OpenGL 实验二】Liang-Barsky 裁剪算法
- 遗传算法(Genetic Algorithm,GA)实例详解
- 查找恶意的TOR中继节点
- Mac自带截图高级技巧
- 设 l í {a,b,c}* 是满足下述条件的符号串构成的语言,陇东学院《编译原理》练习题及答案...
- Alpha版本冲刺(七)
- 获取android模拟器的IP地址