设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13033|回复: 0

SQL去重方法汇总

[复制链接]

83

主题

0

回帖

261

积分

中级会员

Rank: 3Rank: 3

积分
261
发表于 2022-3-26 10:59:45 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!

在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。
在 MySQL 中通常是使用
  1. distinct
复制代码
  1. group by
复制代码
子句,但在支持窗口函数的 sql(如
  1. Hive
复制代码
  1. SQL
复制代码
  1. Oracle
复制代码
等等) 中还可以使用 row_number 窗口函数进行去重。
举个栗子,现有这样一张表 task:

备注:

    1. task_id
    复制代码
    : 任务id;
    1. order_id
    复制代码
    : 订单id;
    1. start_time
    复制代码
    : 开始时间
  1. <strong>注意</strong>:一个任务对应多条订单
复制代码
我们需要求出任务的总数量,因为 task_id 并非唯一的,所以需要去重:
distinct
  1. -- 列出 task_id 的所有唯一值(去重后的记录)

  2. select distinct task_id
  3. from Task;

  4. -- 任务总数
  5. select count(distinct task_id) task_num
  6. from Task;
复制代码
  1. distinct
复制代码
通常效率较低。它不适合用来展示去重后具体的值,一般与
  1. count
复制代码
配合用来计算条数。
  1. distinct
复制代码
使用中,放在
  1. select
复制代码
后边,对后面所有的字段的值统一进行去重。比如
  1. distinct
复制代码
后面有两个字段,那么 1,1 和 1,2 这两条记录不是重复值 。
group by
  1. -- 列出 task_id 的所有唯一值(去重后的记录,null也是值)
  2. -- select task_id
  3. -- from Task
  4. -- group by task_id;

  5. -- 任务总数
  6. select count(task_id) task_num
  7. from (select task_id
  8.       from Task
  9.       group by task_id) tmp;
复制代码
row_number
row_number 是窗口函数,语法如下:
  1. row_number() over (partition by <用于分组的字段名> order by <用于组内排序的字段名>)
复制代码
其中
  1. partition by
复制代码
部分可省略。
  1. -- 在支持窗口函数的 sql 中使用

  2. select count(case when rn=1 then task_id else null end) task_num
  3. from (select task_id
  4.        , row_number() over (partition by task_id order by start_time) rn
  5.    from Task) tmp;
复制代码
此外,再借助一个表 test 来理理 distinct 和 group by 在去重中的使用:
  1. -- 下方的分号;用来分隔行
  2. select distinct user_id
  3. from Test;    -- 返回 1; 2

  4. select distinct user_id, user_type
  5. from Test;    -- 返回1, 1; 1, 2; 2, 1

  6. select user_id
  7. from Test
  8. group by user_id;    -- 返回1;  2

  9. select user_id, user_type
  10. from Test
  11. group by user_id, user_type;    -- 返回1, 1; 1, 2; 2, 1

  12. select user_id, user_type
  13. from Test
  14. group by user_id;    
  15. -- Hive、Oracle等会报错,mysql可以这样写。
  16. -- 返回1, 1 或 1, 2 ; 2, 1(共两行)。只会对group by后面的字段去重,就是说最后返回的记录数等于上一段sql的记录数,即2条
  17. -- 没有放在group by 后面但是在select中放了的字段,只会返回一条记录(好像通常是第一条,应该是没有规律的)
复制代码
到此这篇关于SQL去重方法汇总的文章就介绍到这了,更多相关SQL去重方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表