今天我们来看看大数据开发中rownumber函数。 作为一名程序员,求职面试时时常会遇到需要编写一些基础的sql,编写sql这样做的目的主要是考验求职者的逻辑思维及编写sql基础能力。而rownumber()函数在面试中得到了不少面试官的青睐,有的面试官喜欢用这个知识点来考察应聘者。 我们来看看下面这道题目。 有张员工表tbemployee表包含员工基本信息,每个员工有其对应的userid、username、salary和departmentname 面试官:编写一个SQL查询,找出每个部门工资第二高的员工。 这种情况我们可以尝试用rownumber()函数实现。 语法rownumber()over(partitionby〔要分组的列〕orderby〔排序列〕) rownumber()函数将select语句返回的每一行,从1开始编号,赋予其连续的序号。在查询时应用了一个排序标准后,只有通过序号才能够保证其顺序是一致的,当使用rownumber()函数时,也需要专门一列用于预先排序以便于进行编号。 partitionby关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partitionby用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用。 createtableifnotexiststest。tbemployee(useridint,usernamestring,salarydouble,departmentnamestring)rowformatdelimitedfieldsterminatedby, 新增数据 insertintotest。tbemployee(userid,username,salary,departmentname)values(1,李四,4000,运营部);insertintotest。tbemployee(userid,username,salary,departmentname)values(2,王五,5000,运营部);insertintotest。tbemployee(userid,username,salary,departmentname)values(3,张工,6000,运营部);insertintotest。tbemployee(userid,username,salary,departmentname)values(4,小爱,7000,运营部);insertintotest。tbemployee(userid,username,salary,departmentname)values(5,小张,3000,行政部);insertintotest。tbemployee(userid,username,salary,departmentname)values(6,小李,4000,行政部);insertintotest。tbemployee(userid,username,salary,departmentname)values(7,小王,5000,行政部);insertintotest。tbemployee(userid,username,salary,departmentname)values(8,小洪,6000,行政部);insertintotest。tbemployee(userid,username,salary,departmentname)values(9,小刘,7000,行政部); 能看出每个部门工资第二高的员工分别为 运营部编号为3的张工薪资6000 行政部编号为8的小洪薪资6000 那么Sql如何编写,我们可以用rownumber()这样写。 selectfrom(select,rownumber()over(partitionbydepartmentnameorderbysalarydesc)asrnfromtest。tbemployee)asawherern2; 运行结果: 关于rownumber()函数,在大数据开发中,更多的是用来去重。可以根据分组,取rn1最新的一条记录。 由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。