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 

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

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

(0)
上一篇 2026年1月16日 上午8:43
下一篇 2026年1月16日 上午9:15


相关推荐

  • MD5算法如何被激活成功教程

    MD5算法如何被激活成功教程小明 老师 上次您讲了 MD5 算法 用它生成的信息摘要 真的可以被激活成功教程吗 老师 有很多种方法可以激活成功教程 不过需要明确一点 这里所谓的激活成功教程 并非把摘要还原成原文 为什么呢 因为固定 128 位的摘要是有穷的 而原文数量是无穷的 每一个摘要都可以由若干个原文通过 Hash 得到 小明 如果是这样的话 网上所说的 MD5 激活成功教程到底是怎么回事呢 老师 对于 MD5 的激活成功教程 实际上都属于 碰撞 比如原文 A 通过 MD

    2026年3月17日
    2
  • win10 任务栏锁定,win键没反应

    win10 任务栏锁定,win键没反应现象:之前用win10,换成win10专业版后,安装360优化系统,过了几天后突然发现任务栏好像被锁定一般,按windows键没有任何反应,任务栏打开的文件,图片等等右键也没有反应,讲道理应该有关闭选项的,再次检查发现日期点不开,看不到日历,音量键点了也没有反应。各种百度总之各种找原因都没有找到,直到看到一篇文章才解决问题,原来win10与win7的管理机制不同,不能关闭防火墙的。…

    2022年6月4日
    55
  • Linux更改文件的权限[通俗易懂]

    Linux更改文件的权限[通俗易懂]Linux下一切皆文件,对文件的权限管理是Linux安全的一个重要特性,那么修改文件的权限是一个必要的技能了。一、命令chown(changeowner)-更改文件的所有者语法:chown【-R】账户名/账户名:组名文件名二、命令chgrp(changegroup)-更改文件属于的组别 创建分组的命令:groupadd分组名 添加文件到分组:chgrp组名文件名chgrpgroup_afile_a。 同样chgrp也可以更改目录的组别,用法和文件一样,不过目录.

    2025年9月7日
    11
  • matlab z变换 差分,matlab z变换

    matlab z变换 差分,matlab z变换matlabz 变换 48 页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 19 90 积分第六章离散系统的 z 域分析 在连续系统中 为了避开解微分方程的困难 可以通过拉氏变换把微分方程转换为代数方程 出于同样的动机 也可以通过一种称为 z 变换的数学工具 把差分方程转换为代数方程 6 1z 变换 从拉普拉斯变换到 z 变换 z 变换定义收敛域 一 从拉

    2026年3月19日
    2
  • Web Services规范

    Web Services规范本文中文版来源 http www ibm com developerwor cn webservices ws wsrp index shtml nbsp Webservices 规范 nbsp nbsp nbsp 级别 初级 IBM 2002 年 12 月 01 日 nbsp nbsp nbsp 简单对象访问协议 SOAP 是 W3C 组织的一个 Note 它描述了一种在分散的或分布式的环境中如何交换信息的轻量级协议 Messaging 简单对象

    2026年3月16日
    2
  • 赵雅智_BroadcastReceiver

    赵雅智_BroadcastReceiver

    2022年1月28日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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