SQL分组排序

面试的时候,只要这个工作要求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()函数功能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,140评论 0 13
  • 分析函数,也称为窗口函数,通常被认为仅对数据仓库SQL有用。使用分析函数的查询,基于对数据行的分组来计算总量值。与...
    猫猫_tomluo阅读 8,639评论 3 18
  • 这一周主要学习了 Hive 的一些基础知识,学习了多个 Hive 窗口函数,虽然感觉这些窗口函数没有实际的应用...
    大石兄阅读 7,737评论 2 8
  • 这是很早之前面的,第一次面数据分析的面试,当时还傻乎乎的以为数据分析和数据挖掘是一回事呢。结果才发现,数据分析岗位...
    文哥的学习日记阅读 12,010评论 4 9
  • 一、字符转换函数 1、ASCII() 返回字符表达式最左端字符的ASCII码值。在ASCII()函数中,纯数字的字...
    辉格食品阅读 5,591评论 0 3