欢迎关注方志朋的博客,回复”666“获面试宝典

在使用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中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)

来源:blog.csdn.net/xienan_ds_zj/

article/details/103869048

热门内容:
  • 雷军做程序员时写的博客

  • 学废了!面试官常问的14个......

  • 抖音的服务器究竟有多大?

  • 我研究了一个月阿里的岗位JD,不曾想.....

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

SQL去重的三种方法汇总 ​相关推荐

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

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

  2. SQL去重的三种方法汇总 ​

    今天来看3种SQL里去重的方法 正文 来自:blog.csdn.net/xienan_ds_zj/article/details/103869048 转自:程序员的成长之路 在使用SQL提数的时候,常 ...

  3. SQL去重的三种方法

    目录 1.distinct去重 2.group by去重 3.row_number() over (parttion by 分组列 order by 排序列) 有这么一张test的表, 我们将对这张表 ...

  4. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  5. es6数组去重的三种方法

    1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...

  6. SQL 中去重的三种方法

    点击关注上方"逆锋起笔", 设为"置顶或星标",第一时间送达干货 blog.csdn.net/xienan_ds_zj/article/details/1038 ...

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

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

  8. STL 中给 vector 去重的三种方法

    文章目录 背景 去重思路 解决方案 『一』vector, sort + unique 『二』vector + set(手动赋值) cmpSort() 定义在 Class 外 cmpSort() 定义为 ...

  9. List去重的三种方法,以及性能比较

    1.Collectors.collectingAndThen 这是Stream中的一个收集器,相比普通的Collectors.toList.Collectors.groupingBy等收集器 Coll ...

最新文章

  1. linux 开机提示 Kernel panic - not syncing: Attempted to kill init! 解决方案
  2. CentOS查看CPU信息、位数、多核信息
  3. [云炬创业基础笔记]第七张创业资源测试11
  4. 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
  5. 检查点(Checkpoint)过程如何处理未提交的事务
  6. php网页的注册界面设计,HTML开发博客之注册页面设计(一)
  7. pandas使用笔记(一)导入,查看,读取数据
  8. ffmpeg常用数据结构4
  9. node如何让一个端口同时支持https与http
  10. RedHat7安装及小红帽硬盘分区建议
  11. JAVA反射--通过反射对pojo进行UT覆盖率测试
  12. AirPlay无线技术研究
  13. windows+Texstudio+languagetool修改语法错误
  14. python程序执行完后重头开始做烧饼_下塘烧饼 的动态 - SegmentFault 思否
  15. GA-LSTM的国内外研究现状
  16. 沐圣moolsun:做真正的民族品牌
  17. 智慧地铁内涵、特征与定义
  18. 电脑最全快捷键--建议收藏
  19. 一个简单的ETL开发的过程(informatica)
  20. Python 处理dat文件并画图

热门文章

  1. android 动态改变进度条,Android条纹进度条的实现(调整view宽度仿进度条)
  2. woe分析_【详解】银行信用评分卡中的WOE在干什么?
  3. STM32 I2C总线从机发送接收源码下载,有图有真相!
  4. 美国石油大亨洛克菲勒给儿子的信
  5. Shell开发环境vim编辑器的配置文件vimrc的参数优化
  6. 基于VMware采用kubeadm方式部署单节点k8s集群(练习使用)
  7. 云呼叫中心占领高端市场客户价值是关键
  8. Windows 10 安装 uTorrent 官网下载 uTorrent 时弹出“The 'utorrent' installation process requires Internet conn”
  9. Cocos Creator 初探:修改Engine来调整FPS信息显示
  10. LTE学习笔记——xmind思维导图