SQL去重方法汇总

 更新时间:2022年01月25日 16:44:41   作者:PHP开源社区  
这篇文章主要给大家分享了SQL去重方法汇总,在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。下面我们就来看看去重都有哪些方法吧

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

在 MySQL 中通常是使用 distinct group by子句,但在支持窗口函数的 sql(如Hive SQLOracle等等) 中还可以使用 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_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 在去重中的使用:

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

到此这篇关于SQL去重方法汇总的文章就介绍到这了,更多相关SQL去重方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 数据恢复的多种方法汇总

    MySQL 数据恢复的多种方法汇总

    日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生。但是,如果每次删库都跑路的话,怕是再也不好找工作了吧!所以,删库跑路不是上上策
    2021-06-06
  • 在MySQL数据库之间实现数据同步的配置步骤

    在MySQL数据库之间实现数据同步的配置步骤

    本文介绍了六种常见的MySQL数据同步方法,包括主从复制、双主复制、群集复制、使用第三方工具(如PerconaXtraBackup)和使用MySQLWorkbench进行数据同步,以及编写自定义脚本进行数据同步,每种方法都有其优缺点,需根据实际需求选择,感兴趣的朋友一起看看吧
    2025-02-02
  • Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    Mysql数据库编码问题 (修改数据库,表,字段编码为utf8)

    个人建议,数据库字符集尽量使用 utf8(HTML页面对应的是utf-8),以使你的数据能很顺利的实现迁移
    2011-10-10
  • 两种mysql对自增id重新从1排序的方法

    两种mysql对自增id重新从1排序的方法

    本文介绍了两种mysql对自增id重新从1排序的方法,简少了对于某个项目初始化数据的工作量,感兴趣的朋友可以参考下
    2015-07-07
  • 安装MySQL后include目录下没有找到libmysql.lib

    安装MySQL后include目录下没有找到libmysql.lib

    安装了MySQL后,在其安装目录下的include文件夹并没有找到libmysql.lib,主要原因是在安装MySQL的时候,没有勾选develop component这一选项造成的
    2014-08-08
  • 一文带你搞懂MySQL中的隐式类型转换和显式类型转换

    一文带你搞懂MySQL中的隐式类型转换和显式类型转换

    在mysql中,当操作涉及不同类型的数据时,会根据一定的规则自动进行类型转换,本文主要来和大家聊聊隐式类型转换和显式类型转换的相关知识,需要的可以参考一下
    2025-04-04
  • Linux 安装JDK Tomcat MySQL的教程(使用Mac远程访问)

    Linux 安装JDK Tomcat MySQL的教程(使用Mac远程访问)

    这篇文章主要介绍了Linux 安装JDK Tomcat MySQL(使用Mac远程访问),本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 在win10系统下安装Mysql 5.7.17图文教程

    在win10系统下安装Mysql 5.7.17图文教程

    因为想要在公司电脑上安装Mysql,于是到官网上下载了最新版本的Mysql-5.7.17,其实安装方法也很简单,下面小编把安装过程分享到脚本之家平台供大家参考
    2017-03-03
  • 详解MySQL数据库设置主从同步的方法

    详解MySQL数据库设置主从同步的方法

    最近一直在研究mysql的主从同步问题,现在网上也有很多资料,现在感觉写的都很好(当初感觉写的很差,是因为自己的领悟较差),于是想跟大家分享一下自己配置的整个过程和经验。有需要的朋友欧美可以参考借鉴,感兴趣的朋友们下面来一起学习学习吧。
    2016-11-11
  • MySQL查询截取的深入分析

    MySQL查询截取的深入分析

    这篇文章主要给大家介绍了关于MySQL查询截取的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论