Oracle 分组查询取第一条记录


    今天在查询数据的过程中碰到一个问题,需要选择出每个分组数据中的第一条记录。比如,我现在需要导入所有的拍卖手册号,由于目前已有的每个手册号都有很多拍卖项目,所以我需要取到每一个手册号的第一个项目ID,这样才能方便对应我的需求。

    今天自己实现的思路主要是参考http://www.itpub.net/thread-589011-1-1.html,楼主HuiYi_love的帖子来实现了,在这里和大家分享一下,让碰到类似这样的问题有所借鉴:

样例如下:

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

7369 SMITH CLERK 7902 17-12月-80 800 20

7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30

7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30

7566 JONES MANAGER 7839 02-4月 -81 2975 20

7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30

7698 BLAKE MANAGER 7839 01-5月 -81 2850 30

7782 CLARK MANAGER 7839 09-6月 -81 2450 10

7788 SCOTT ANALYST 7566 19-4月 -87 3000 20

7839 KING PRESIDENT 17-11月-81 5000 10

7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30

7876 ADAMS CLERK 7788 23-5月 -87 1100 20

7900 JAMES CLERK 7698 03-12月-81 950 30

7902 FORD ANALYST 7566 03-12月-81 3000 20

7934 MILLER CLERK 7782 23-1月 -82 1300 10

已選取 14 個資料列.

 

SQL> select *

from (select emp.*,row_number() over(partition by deptno order by rownum) cn from emp)

where cn = 1;

 

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CN

---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ----------

7782 CLARK MANAGER 7839 09-6月 -81 2450 10 1

7369 SMITH CLERK 7902 17-12月-80 800 20 1

7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 1

 

目前歷時: 00:00:00.00

SQL>

--------------------

    从以上样例可以看出首先是依据emp表的DEPTNO字段进行分组,总共可以分为三组(102030),然后是对DEPTNO=10的小分组cn标上123,最后将cn=1的记录选择出来。样例总体上实现的结果就是将表emp每种DEPTNO中字段排列在最前的记录选择出来,如“7782 CLARK”是属于DEPTNO=10的小分组中排列最靠前的;“7369 SMITH”是属于DEPTNO=20的小分组中排列最靠前的;其它的可依此类推。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM