首页 > 数据库 >SQL去重的三种方法汇总

SQL去重的三种方法汇总

时间:2024-06-06 23:29:38浏览次数:27  
标签:task group -- 汇总 三种 user SQL id select

SQL去重的三种方法汇总

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

标签:task,group,--,汇总,三种,user,SQL,id,select
From: https://blog.csdn.net/u012955829/article/details/139457418

相关文章

  • 大模型学习笔记-汇总篇
    本文记录一下最近一个月学习的大模型相关的技术知识点,为拥抱AI浪潮做些技术储备。大模型术语相关参数规模GPT3.5千亿级别GPT41.8W亿级别国内一般都是十亿或百亿级别ChatGLM2_2K_6BBAICHUAN_4K_13B淘宝星辰_4K_13BTOKEN长度Token是指被LLM处理的离散的数据单......
  • MySQL三大日志
    总述:undolog日志是inndb存储引擎层生成的日志,实现了事务的原子性,主要用于事务回滚和MVCC。redolog日志是inndb存储引擎层生成的日志,实现了事务的持久性,主要用于掉电等故障恢复。binlog日志是Server层生成的日志,主要用于数据备份和主从复制。undolog回滚日志undolog是......
  • Web学习_SQL注入_联合查询注入
    UNION操作符用于合并两个或多个SELECT语句的结果集,UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名,并且UNION内部的SELECT语句必须拥有相同数量的列。联合查询注入就是利用union操作符,将攻击者希望查询的语句注入到正常select语句之后,并返回输出......
  • sql 条件用空值进行比对的结果
    selectSUM(e.Qty)asInputQtyfromUT_InputInfoasainnerjoinT_ProcessDefasbona.ProcessID=b.ProcessIDinnerjoinUT_PrdTaskasdona.OrderID=d.OrderIDinnerjoindbo.UT_LabelInfoRecaseona.LabelPrtRecID=e.PrtRecIDinnerjoinUT_PrdTaskash......
  • Web攻防:SQL注入 - 前置知识
    SQL注入-前置知识1.注入原理1.1.什么是SQL注入1.2.SQL注入产生的条件2.系统函数2.1.version()-MySQL版本2.2.user()-数据库用户名2.3.database()-数据库名2.4.@@datadir-数据库路径2.5.@@version_compile_os-操作系统版本3.字符串连接函数3.1.C......
  • 聊聊如何理解MySQL引擎--Innodb和MyISAM和Memory
    mysql的常见的引擎有许多比如,MYISAM、Innodb、Memory、MERGE。可以通过mysql>showengines;查看数据库提供的引擎:我们今天聊聊如何理解Innodb和MyISAM,Memory,这是面试时会问的问题。首先是Innodb:先上概念:Innodb:行级锁,提供了具有提交、回滚和崩溃回复能力的事务安全,支......
  • Java (Docker MySql)
    前沿加油每天进步一点就是无敌可以去官网下载Docker yuminstall-ydocker重启刷新停止sudosystemctlstartdockersudosystemctlstopdockersudosystemctlrestartdocker哈可以装客户端端dcocker直接安装就完事了  然后安装mysql然后遇到这样的......
  • python SQLite3 库
    sqlite3是一个python中内置数据库,执行时会在本地文件夹中创建一个数据库   importsqlite3#连接到数据库,如果数据库不存在,则会被创建conn=sqlite3.connect('example.db')#创建一个cursor对象cursor=conn.cursor()#创建表格的SQL命令create_table_query......
  • C# 调用外部exe的三种方式
    C# 调用外部exe的三种方式调用外部exe是常用的功能,本文主要介绍了C# 调用外部exe的三种方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧 方式一:直接调用Process类来实现:usingSystem.Diagnostics;Processp=Process.Start("program.e......
  • long类型精度丢失问题的三种解决方案 (在Long长度大于17位时会出现精度丢失的问题)
    1.简介​对于Long类型的数据,如果我们在Controller层将结果序列化为json,直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题2.解决方案2.1注解2.1.1@JsonFormat@JsonFormat(shape=JsonFormat.Shape.STRING)2.1.2@JsonSerialize@JsonSerialize(using=To......