SQL分组排序
2019-06-01 本文已影响13人
敢敢宝宝
面试的时候,只要这个工作要求SQL能力,面试官必然会问SQL怎么实现分组排序?刚开始,我一直以为是没有分组排序这个函数的。直到第一次去面试腾讯时,笔试题目中有一题是分组排序,我写得是变量赋值排序。面试官一脸懵逼的看着我,又问道有什么直接的函数吗?这一问,真把我难住了。这位面试官比较nice,很耐心的跟我说:你回去查查这个三个函数的用法及区别rank()over()、row_number()over()、dense_rank()over()
1.row_number()over()分组排序功能:
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行。 partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
例:employee,根据部门分组排序
select empno,workdept,salary,row_number()over(partition by workdept order by salary desc)
as rank from data.employee
2.rank()over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
select workdept,salary,rank()over(partition by workdept order by salary desc) as rank from enployee
order by workdept desc
3.dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
select workdept,salary,dense_rank()over(partition by workdept order by salary desc) as rank from employee
order by workdept
ROW_NUMBER删除重复数据 :
—假设表TAB中有a,b,c三列,可以使用下列语句删除a,b,c都相同的重复行。
DELETE FROM (select year,QUARTER,RESULTS,row_number()
over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS)
AS ROW_NO FROM SALE )
WHERE ROW_NO>1