ROW_NUMBER() OVER()函数用法;(分组,排序),partition by(每个分类里面的前多少名)
对于比较复杂的分组排序问题,有下面一个实例
截止2017年8月31日有效的买卖房源中,各城市挂牌的面积最大的前十和面积最小的前十的平均单价。字段包括:城市、类型(面积最大前十/面积最小前十)、挂牌价、建筑面积、平均挂牌单价(精确到元) rpt.rpt_housedel_housedel_all_info_teach_da 字段名 字段中文名 数据类型 枚举值 housedel_id 房源id bigint biz_type 业务类型 Bigint 200200000001:买卖,200200000002:出租 state_name 房源状态名称 string 有效,无效,签约, city_name 城市名称 String build_area 建筑面积 decimal(24,2) total_price 挂牌价 Decimal(24,12) 单位:元 pt 分区 string select t1.city_name ,t1.type ,t1.total_price ,t1.build_area ,round(t1.avg,0) from ( select city_name ,'面积最大前十' as type ,build_area ,total_price ,total_price/build_area as avg ,row_number() over (partition by city_name order by build_area desc) as rn from rpt.rpt_housedel_housedel_all_info_teach_da where pt='20170831000000' and state_name='有效' and biz_type='200200000001' having rn<=10 union all select city_name ,'面积最小前十' as type ,build_area ,total_price ,total_price/build_area as avg ,row_number() over (partition by city_name order by build_area) as rn from rpt.rpt_housedel_housedel_all_info_teach_da where pt='20170831000000' and state_name='有效' and biz_type='200200000001' having rn<=10 )t1
1、row_number() 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) rank FROM employee -------------------------------------- 000010 A00 152750 1 000110 A00 66500 2 000120 A00 49250 3 200010 A00 46500 4 200120 A00 39250 5 000020 B01 94250 1 000030 C01 98250 1 000130 C01 73800 2 复制代码 (2)对查询结果进行排序:(无分组) 复制代码 SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee -------------------------------------- 000010 A00 152750 1 000030 C01 98250 2 000070 D21 96170 3 000020 B01 94250 4 000090 E11 89750 5 000100 E21 86150 6 000050 E01 80175 7 000130 C01 73800 8 000060 D11 72250 9 复制代码 row_number() over()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序). 2、rank() over()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内). 复制代码 select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept; ------------------ A00 39250 1 A00 46500 2 A00 49250 3 A00 66500 4 A00 152750 5 B01 94250 1 C01 68420 1 C01 68420 1 C01 73800 3 复制代码 3、dense_rank() over()是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 . 复制代码 select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept; ------------------ A00 39250 1 A00 46500 2 A00 49250 3 A00 66500 4 A00 152750 5 B01 94250 1 C01 68420 1 C01 68420 1 C01 73800 2 C01 98250 3 复制代码 使用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
浙公网安备 33010602011771号