在使用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_numfrom 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_numfrom (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_numfrom (select task_id , row_number() over (partition by task_id order by start_time) rn from task) tmp; 此外,再借助一个表 test 来理理 distinct 和 group by 在去重中的使用:
RPA自动办公机器人风潮兴起 AI逐渐渗透到各行各业
艾森股份:半导体封装材料龙头企业冲刺科创板
过去六年里,苹果大约收购了100家公司
2017年CES:无人驾驶汽车的狂热时代
常见的3轴、3+2轴、5轴加工的区别是什么
MySQL去重3种方法分享
采用ADSP-TS201S芯片的图像采集处理系统设计
环保柜的设计要考虑哪些问题
AMD锐龙7 5800X3D处理器定价和上市日期公布
链接全球资源,安富利与本土客户共享数智机遇
小米8周年纪念版取代了小米7_沿用苹果的3D机构光技术
德豪润达LED芯片专案建设获600万政府补助
你知道滤波电容应该怎么选吗?
区块链究竟是一项什么技术和比特币有什么关联
温度检测电路设计方案汇总(四款模拟电路设计原理图详解)
苹果iOS10.2更新实测:功能详情及IoT应用详情
5G光通信芯片技术和材料与种类简介及主要供应商市场规模情况
24V伏供电的CRT高压电源电路图
NXP/英特尔/微软 CES大秀自驾车科技
十亿泵车失踪案的背后,工业互联网领域是否会诞生黑色产业