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