今天在查詢數據的過程中碰到一個問題,需要選擇出每個分組數據中的第一條記錄。比如,我現在需要導入所有的拍賣手冊號,由於目前已有的每個手冊號都有很多拍賣項目,所以我需要取到每一個手冊號的第一個項目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的小分組中排列最靠前的;其它的可依此類推。