点击关注上方“逆锋起笔”,

设为“置顶或星标”,第一时间送达干货

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 中去重的三种方法相关推荐

  1. SQL中去重的三种方法,还有谁不会?

    来自:CSDN,作者:米竹 链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048 SQL去重是数据分析工作中比较常见的一个场景 ...

  2. SQL中累加的三种方法

    之前给小伙伴们介绍了三种去重的方法,虽然不能留言,但是看到大家的点赞和在看数都比较多,今天再给大家分享一下三种累加的方法. 有如下表ADD_NUM 我们希望实现如下结果: 开窗函数学过开窗函数的小伙伴 ...

  3. SQL去重的三种方法汇总

    SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...

  4. PHP中删除目录的三种方法

    原文链接:http://www.chinaz.com/program/2008/1022/41645.shtml PHP中删除目录的三种方法 1.递规法:利用递归一层一层的删. deleteDir($ ...

  5. OpenCV精进之路(零):访问图像中像素的三种方法

    访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...

  6. 在MATLAB中生成矩阵的三种方法

    在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...

  7. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  8. java定时执行某个方法_Java中定时执行任务的三种方法

    Java中定时执行任务的三种方法 1)java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务: Timer timer=new Timer(); timer.sche ...

  9. JAVA 通过value获取Map中key的三种方法

    JAVA 通过value获取Map中key的三种方法 简介 方法描述 循环法 Stream方法 Apache Commons Collections的BidiMap 总结 简介 我们都知道Map是存放 ...

最新文章

  1. python批量读取csv文件-使用Python读写csv文件的三种方法
  2. 试除法的妙用【O(√N) 复杂度】
  3. python alpha_如何用Python打造一个简易版的Alpha GO?
  4. 树莓派利用Django搭建聊天网页服务器 —— 准备篇
  5. 人体轮廓_人体艺术:赏世界著名的女人体油画:身体轮廓
  6. json和python中字典的区别和联系_Python中 json字符串和字典的区别
  7. 滴滴与比亚迪合作的无人车亮相:搭载6颗摄像头
  8. python输入姓名年龄输出年龄最大的_输入姓名打印年龄练习
  9. 中文信息处理——语料划分测试集与训练集
  10. ExtJs之工具栏及菜单栏
  11. UNIX 环境高级编程(四)—— dirent.h
  12. 删除60天之前的elasticsearch索引
  13. C++ const,static,inline
  14. 【OpenGL 实验二】Liang-Barsky 裁剪算法
  15. 遗传算法(Genetic Algorithm,GA)实例详解
  16. 查找恶意的TOR中继节点
  17. Mac自带截图高级技巧
  18. 设 l í {a,b,c}* 是满足下述条件的符号串构成的语言,陇东学院《编译原理》练习题及答案...
  19. Alpha版本冲刺(七)
  20. 获取android模拟器的IP地址

热门文章

  1. 机器人开发--CanOpen
  2. NKOI 3124 珍珠吊坠
  3. 【ArcGIS】渔网A和不规则栅格B算面积比
  4. 企业版小程序申请步骤
  5. 计算机版图设计培训,版图设计培训资料.ppt
  6. 【产业互联网周报】国内云计算厂商加紧布局:华为新成立云计算公司运营国内业务、阿里云入驻上海新研发中心...
  7. php utf-8正则匹配汉字,php utf-8编码 正则匹配中文
  8. Flink Watermark 源码分析
  9. 为什么企业不喜欢标准成本法?
  10. oracle+m10-5,pchm10是oppo什么型号