今天在查询数据的过程中碰到一个问题,需要选择出每个分组数据中的第一条记录。比如,我现在需要导入所有的拍卖手册号,由于目前已有的每个手册号都有很多拍卖项目,所以我需要取到每一个手册号的第一个项目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字段进行分组,总共可以分为三组(10、20、30),然后是对DEPTNO=10的小分组cn标上1、2、3,最后将cn=1的记录选择出来。样例总体上实现的结果就是将表emp每种DEPTNO中字段排列在最前的记录选择出来,如“7782 CLARK”是属于DEPTNO=10的小分组中排列最靠前的;“7369 SMITH”是属于DEPTNO=20的小分组中排列最靠前的;其它的可依此类推。