来源:blog.csdn.net/xienan_ds_zj/article/details/103869048
大家好!我是鸭哥。
在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。
在 MySQL 中通常是使用 distinct 或 group by子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。
举个栗子,现有这样一张表 task:
备注:
task_id: 任务id;
order_id: 订单id;
start_time: 开始时间
注意:一个任务对应多条订单
我们需要求出任务的总数量,因为 task_id 并非唯一的,所以需要去重:
distinct
select count(distinct task_id) task_num
from Task;
distinct 通常效率较低。它不适合用来展示去重后具体的值,一般与 count 配合用来计算条数。
distinct 使用中,放在 select 后边,对后面所有的字段的值统一进行去重。比如distinct后面有两个字段,那么 1,1 和 1,2 这两条记录不是重复值 。
group by
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 部分可省略。
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;
select distinct user_id, user_type
from Test;
select user_id
from Test
group by user_id;
select user_id, user_type
from Test
group by user_id, user_type;
select user_id, user_type
from Test
group by user_id;
程序员技术交流群有读者私信鸭哥我说:想进大厂,但是现在进大厂太难了!因此,鸭哥我特意邀请了一些华为、腾讯、阿里的朋友在群里面,与大家一起交流经验、技术成长。有兴趣入群的读者,可以扫描下方二维码添加微信,记得备注:城市+昵称+技术方向 。
我就知道你会点赞+“在看”