row_number() over()分析函数:对记录进行编号。
--从多到少排列销售人员的工资,取前三行。如果该部门少于三人,则返回的记录少于三个。
SELECT *
FROM (SELECT A.deptno,
A.ENAME,
A.SAL,
ROW_NUMBER() OVER(PARTITION BY a.deptno ORDER BY A.SAL DESC) RN
FROM EMP A)tmp
WHERE tmp.RN < 4;
说明:
执行顺序:
1执行 "PARTITION BY a.deptno ORDER BY A.SAL DESC":按照deptno进行分组,然后组内按照sal进行降序排列。
2执行 "ROW_NUMBER() OVER" :将组内查询好的数据进行编号(ps:是组内编号,即deptno内的编号)。RN是别名,将查询结果取了个别名。
3最后执行外层select
总结:
PARTITION BY a.deptno:按照deptno进行分区。有些书上面写的是分组,其实他与group by的分组是有区别的。
区别在于partition BY 把同一deptno放在一块,不会进行任何的合并,比如有3个deptno = 1 的记录,
那在分区中还是会有3个。但是group by不一样,如果有3个deptno = 1的记录,分组后就只会有1条结果。
所有我认为partition BY 更多的是分区,把同一的数据放在一块,而group by是分组,相同的数据只取1条
row_number分析函数
最新推荐文章于 2024-05-27 10:39:13 发布