资源描述:
《oracle中利用函数获得topn的结果集》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、oracle中利用函数获得topn的结果集 RANK(),DENSE_RANK()是oracle8i的两个有趣的分析函数,可以用来解决top-N问题.两个函数的区别可以从下面例子中看出:createtableemp(Empnovarchar2(10),Enamevarchar2(10),Jobvarchar2(10),Mgrvarchar2(10),Salvarchar2(10));insertintoempvalues('Empno1','Ename1','Job1','Mgr1','1');insertintoempvalues('Empno2','Ename2','Job2'
2、,'Mgr2','2');insertintoempvalues('Empno3','Ename3','Job3','Mgr3','3');insertintoempvalues('Empno4','Ename4','Job4','Mgr4','4');insertintoempvalues('Empno5','Ename5','Job5','Mgr5','5');insertintoempvalues('Empno6','Ename6','Job6','Mgr6','6');insertintoempvalues('Empno7','Ename7','Job7','Mgr7','4'
3、);insertintoempvalues('Empno8','Ename8','Job8','Mgr7','5');insertintoempvalues('Empno9','Ename9','Job9','Mgr7','6');commit;SELECTEmpno,Ename,Job,Mgr,Sal,RANK()OVER(ORDERBYSALDescNULLSLAST)ASRank,DENSE_RANK()OVER(ORDERBYSALDescNULLSLAST)ASDrankFROMEmpORDERBYSALDescNULLSLAST;EMPNOENAMEJOBMGRSALRAN
4、KDRANK----------------------------------------------------------------------Empno6Ename6Job6Mgr6611Empno9Ename9Job9Mgr7611Empno5Ename5Job5Mgr5532Empno8Ename8Job8Mgr7532Empno4Ename4Job4Mgr4453Empno7Ename7Job7Mgr7453Empno3Ename3Job3Mgr3374Empno2Ename2Job2Mgr2285Empno1Ename1Job1Mgr1196结果是不是很奇妙?如果我们
5、自己写sql实现,是需要一些技巧的。1.利用RANK()可以实现top-N问题下面这个sql可以显示,最大的几个Sal,相同Sal的记录也同样显示.SELECTEmpno,Ename,Job,Mgr,SalFROM(SELECTEmpno,Ename,Job,Mgr,Sal,RANK()OVER(ORDERBYSALDescNULLSLAST)ASEmp_RankFROMEmpORDERBYSALDescNULLSLAST)WHEREEmp_Rank=1;EMPNOENAMEJOBMGRSAL-----------------------------------------------
6、---Empno6Ename6Job6Mgr66Empno9Ename9Job9Mgr76SELECTEmpno,Ename,Job,Mgr,SalFROM(SELECTEmpno,Ename,Job,Mgr,Sal,RANK()OVER(ORDERBYSALDescNULLSLAST)ASEmp_RankFROMEmpORDERBYSALDescNULLSLAST)WHEREEmp_Rank<4;EMPNOENAMEJOBMGRSAL--------------------------------------------------Empno6Ename6Job6Mgr66Empno
7、9Ename9Job9Mgr76Empno5Ename5Job5Mgr55Empno8Ename8Job8Mgr75SELECTEmpno,Ename,Job,Mgr,SalFROM(SELECTEmpno,Ename,Job,Mgr,Sal,RANK()OVER(ORDERBYSALDescNULLSLAST)ASEmp_RankFROMEmpORDERBYSALDescNULLSLAST)WHEREEmp_Rank<3;EMPNOENAME