LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL中的三种去重方式:DISTINCT,GROUP BY与ROW_NUMBER()

admin
2024年2月19日 15:16 本文热度 524
在日常使用SQL统计数据过程中,我们往往会遇到重复数据的情况,如果不进行去重处理了话,那么我们统计的数据偏差会比较大。那使用SQL如何对数据进行去重呢?

今天介绍三种去重方式。

1.使用DISTINCT关键字

这是SQL中最常用的去重方式。DISTINCT 关键字用于返回唯一不同的值。在一个SELECT语句中,你可以使用 DISTINCT 关键字。例如:

  • SELECT DISTINCT column_name FROM table_name;

这条语句会返回table_name中所有不同的column_name值。

2.使用GROUP BY语句

GROUP BY语句用于结合聚合函数,根据一个或多个列对结果集进行分组。在GROUP BY查询中,如果对所有列都进行分组,那么它的结果就等同于使用了DISTINCT关键字。例如:

SELECT column_name FROM table_name GROUP BY column_name;

这个查询会返回table_name中所有不同的column_name值。

3.使用 ROW_NUMBER() 函数

ROW_NUMBER() 是一个窗口函数,为每个分组中的每行分配唯一的行号,它可以用来删除重复行。例如:

WITH CTE AS (SELECT column_name, ROW_NUMBER() OVER(PARTITION BY column_name ORDER BY ( SELECT 0)) RN FROM table_name) SELECT column_name FROM CTE WHERE RN = 1;

这个查询将返回table_name中所有不同的column_name值。

在此查询中,使用 ROW_NUMBER() OVER(PARTITION BY column_name ORDER BY (SELECT 0)) 可以为每个 column_name 分组中的每一行分配一个唯一的行号,但这个行号的分配并不依赖于任何特定的排序。这样,你可以选择每个 column_name 分组中的任意一行,因此 WHERE RN = 1 可以选择每个分组的第一行。

如果你不关心选择哪一行,或者如果表中的所有行对于每个 column_name 都是唯一的,那么这样做是可以的。如果你希望基于某种特定的排序来选择行(例如,选择每个分组中最新或最旧的行),那么你需要使用一个真正的排序表达式,而不是 SELECT 0。

比如说,表table_name中有两列,一列是column_name,一列是create_time,因为每个column_name下可能有重复数据,且create_time可能不一样,我们去重的规则是取最近一条column_name的数据,那么去重的SQL如下,将(SELECT 0) 替换成create_time desc:

WITH CTE AS (SELECT column_name, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY create_time DESC) RN FROM table_name) SELECT column_name FROM CTE WHERE RN = 1;


简单总结下今天分享的内容。

今天主要分享了SQL中的3种去重方式:使用 DISTINCT 关键字,GROUP BY语句,和 ROW_NUMBER() 函数。

在实际使用时,可以根据具体的需求和数据情况选择合适的方法。希望本文对您有所帮助。


该文章在 2024/2/19 15:16:16 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved