SQL去重的三种方法汇总
欢迎关注方志朋的博客,回复”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去重的三种方法汇总 相关推荐
- SQL去重的三种方法汇总
SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...
- SQL去重的三种方法汇总
今天来看3种SQL里去重的方法 正文 来自:blog.csdn.net/xienan_ds_zj/article/details/103869048 转自:程序员的成长之路 在使用SQL提数的时候,常 ...
- SQL去重的三种方法
目录 1.distinct去重 2.group by去重 3.row_number() over (parttion by 分组列 order by 排序列) 有这么一张test的表, 我们将对这张表 ...
- pdo_fetch执行mysql_PDO中执行SQL语句的三种方法
在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...
- es6数组去重的三种方法
1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...
- SQL 中去重的三种方法
点击关注上方"逆锋起笔", 设为"置顶或星标",第一时间送达干货 blog.csdn.net/xienan_ds_zj/article/details/1038 ...
- SQL中去重的三种方法,还有谁不会?
来自:CSDN,作者:米竹 链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048 SQL去重是数据分析工作中比较常见的一个场景 ...
- STL 中给 vector 去重的三种方法
文章目录 背景 去重思路 解决方案 『一』vector, sort + unique 『二』vector + set(手动赋值) cmpSort() 定义在 Class 外 cmpSort() 定义为 ...
- List去重的三种方法,以及性能比较
1.Collectors.collectingAndThen 这是Stream中的一个收集器,相比普通的Collectors.toList.Collectors.groupingBy等收集器 Coll ...
最新文章
- linux 开机提示 Kernel panic - not syncing: Attempted to kill init! 解决方案
- CentOS查看CPU信息、位数、多核信息
- [云炬创业基础笔记]第七张创业资源测试11
- 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
- 检查点(Checkpoint)过程如何处理未提交的事务
- php网页的注册界面设计,HTML开发博客之注册页面设计(一)
- pandas使用笔记(一)导入,查看,读取数据
- ffmpeg常用数据结构4
- node如何让一个端口同时支持https与http
- RedHat7安装及小红帽硬盘分区建议
- JAVA反射--通过反射对pojo进行UT覆盖率测试
- AirPlay无线技术研究
- windows+Texstudio+languagetool修改语法错误
- python程序执行完后重头开始做烧饼_下塘烧饼 的动态 - SegmentFault 思否
- GA-LSTM的国内外研究现状
- 沐圣moolsun:做真正的民族品牌
- 智慧地铁内涵、特征与定义
- 电脑最全快捷键--建议收藏
- 一个简单的ETL开发的过程(informatica)
- Python 处理dat文件并画图
热门文章
- android 动态改变进度条,Android条纹进度条的实现(调整view宽度仿进度条)
- woe分析_【详解】银行信用评分卡中的WOE在干什么?
- STM32 I2C总线从机发送接收源码下载,有图有真相!
- 美国石油大亨洛克菲勒给儿子的信
- Shell开发环境vim编辑器的配置文件vimrc的参数优化
- 基于VMware采用kubeadm方式部署单节点k8s集群(练习使用)
- 云呼叫中心占领高端市场客户价值是关键
- Windows 10 安装 uTorrent 官网下载 uTorrent 时弹出“The 'utorrent' installation process requires Internet conn”
- Cocos Creator 初探:修改Engine来调整FPS信息显示
- LTE学习笔记——xmind思维导图