工作成长录

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  
注:上面三个函数是Oracle数据库实现的分组排序,MYSQL没有这三个函数。实现分组排序需要设置变量赋值,见MYSQL如何实现row_number()over()函数功能
上一篇下一篇

猜你喜欢

热点阅读