sql中三种去重的方式_三种重采样方法的特点

sql中三种去重的方式_三种重采样方法的特点点击关注上方“逆锋起笔”,设为“置顶或星标”,第一时间送达干货blog.csdn.net/xienan_ds_zj/article/details/103869048作者:程序员的成长之路…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


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


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

blog.csdn.net/xienan_ds_zj/article/details/103869048

作者:程序员的成长之路

SQL去重是数据分析工作中比较常见的一个场景,今天给大家具体介绍3种去重的方法。

在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。

在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。

举个栗子,现有这样一张表 task:

13fe7bac6a455bc8d0a830ee2e72559d.png

备注:

  • 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 在去重中的使用:

7966af2240bb3db8712a5059cf83fecc.png

-- 下方的分号;用来分隔行
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中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)

逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂的经验精品学习资料职业路线副业思维,微信搜索逆锋起笔关注!

又一本 Python 可视化好书来了!

GitHub 人脸属性编辑神器横空出世!

代码生成器用起来,是真的爽~

一次完整的 Http 请求过程

一本免费的深度学习漫画书



8d8c86a0c7ccc277546fe6ac1c32c673.png

更多精彩内容,请关注「数据前线」

记得点「赞」「在看」

爱你们587c035047dcf743355fde33258b7a58.png 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192259.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PHP 导出网页表格如何对标签中的内容设置属性

    PHP 导出网页表格如何对标签中的内容设置属性

  • tensor 和 numpy 的互相转换

    tensor 和 numpy 的互相转换为什么要相互转换:1.要对tensor进行操作,需要先启动一个Session,否则,我们无法对一个tensor比如一个tensor常量重新赋值或是做一些判断操作,所以如果将它转化为numpy数组就好处理了。下面一个小程序讲述了将tensor转化为numpy数组,以及又重新还原为tensor:2.Torch的Tensor和numpy的array会共享他们的存储空间,修改一个会导致另外的一…

    2022年10月19日
  • PyQt5入门教程[通俗易懂]

    PyQt5入门教程[通俗易懂]0x00安装环境清单我使用的环境如下:Windows10(Build17763)Python3.7.2VSCode1.33.0PyQt5QtDesigner如果你使用的是O

  • 最新朋友圈集赞生成器_朋友圈点赞生成器免费

    最新朋友圈集赞生成器_朋友圈点赞生成器免费大家好这是一款朋友圈积攒截图小程序里面内涵三款样式生成,一款图文,一款分享,一款查看的样式也就是我们微信朋友圈所用到的样式就包含了里面的流量主那些可以用户自由的添加哈!赞的数量那些可以用户自定义的哈另外所需的内容也是用户自定义的安装方法的话和往常一样!直接微信开发者工具打开源码然后设置一个合法域名上传审核就可以了合法域名在压缩包里面,搭建解压了就可以看到了小程序源码下载地址:…

  • 适配器的作用计算机网络,网络适配器的作用

    适配器的作用计算机网络,网络适配器的作用网络适配器是计算机用来联网的一种设备,也就是网卡。一般这种设备就在主板的插槽中插着,它的工作原理就是通过网络介质来传输一些数据,并转为其他的格式,使这种格式能够被其他的设备所识别。网络适配器的技术参数有很多,例如带宽、电气接口方式等。网络适配器又称网卡或网络接口卡(NIC),英文名NetworkInterfaceCard。它是使计算机联网的设备。平常所说的网卡就是将PC机和LAN连接的网络适配器。…

  • 主宰操作系统的经典算法

    主宰操作系统的经典算法此篇文章带你梳理一下操作系统中都出现过哪些算法进程和线程管理中的算法进程和线程在调度时候出现过很多算法,这些算法的设计背景是当一个计算机是多道程序设计系统时,会频繁的有很多进程或者线程来同时竞争CPU时间片。那么如何选择合适的进程/线程运行是一项艺术。当两个或两个以上的进程/线程处于就绪状态时,就会发生这种情况。如果只有一个CPU可用,那么必须选择接下来哪个进程/线程可以运行。操作系统中有一个叫做调度程序(scheduler)的角色存在,它就是做这件事儿的,调度程序使用的算法叫做调度算

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号