Oracle分組排序查詢

原討論鏈接: [url]http://www.itpub.net/thread-1034530-1-1.html[/url]

最近遇到一場景:
查詢所有賬戶在某天的最新修改的記錄

其中,某些賬戶在同一天內可能不止修改一次。


把此查詢按討論中簡化一下,建一數據表

CREATE TABLE HW
(DEPID NUMBER,
DEPT VARCHAR2(30),
AMOUNT NUMBER);



插入一些測試數據:

INSERT INTO HW VALUES(10,'北京',100);
INSERT INTO HW VALUES(10,'上海',200);
INSERT INTO HW VALUES(10,'南京',300);
INSERT INTO HW VALUES(20,'山東',400);
INSERT INTO HW VALUES(20,'河南',500);
INSERT INTO HW VALUES(20,'河北',600);
INSERT INTO HW VALUES(30,'湖南',700);
INSERT INTO HW VALUES(30,'浙江',800);
INSERT INTO HW VALUES(30,'陝西',900);


[b]查詢要求是:[/b]
要求用sql查詢每個分組中amount最大的前兩條記錄

這裏提供兩種查詢:一種爲不用子查詢的方法;另一種是使用子查詢的方法

不使用子查詢語句爲: (簡單的分析函數的應用, 分析函數還包括rank()over(),dense_rank()over()等)

SELECT * FROM
(SELECT T.*, ROW_NUMBER() OVER(PARTITION BY DEPID ORDER BY AMOUNT DESC) RN FROM HW T)
WHERE RN < 3


查詢的結果是:
DEPID DEPT AMOUNT RN
---------- ------------------------------ ---------- ----------
10 南京 300 1
10 上海 200 2
20 河北 600 1
20 河南 500 2
30 陝西 900 1
30 浙江 800 2

6 rows selected


使用子查詢的語句爲:

SELECT *
FROM HW tr
WHERE
(SELECT COUNT(*) FROM HW WHERE tr.DEPID=DEPID AND AMOUNT>tr.AMOUNT)< 2
ORDER BY DEPID, TR.AMOUNT DESC



查詢結果是:
DEPID DEPT AMOUNT
---------- ------------------------------ ----------
10 南京 300
10 上海 200
20 河北 600
20 河南 500
30 陝西 900
30 浙江 800

6 rows selected


兩種查詢各有優缺點:
不用子查詢的方法利用了Oracle自身的查詢方法,效率會高些,但是給移稙帶來不利影響
子查詢的優點是可用於任何數據庫,但是效率差些
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章