最近遇到一場景:
查詢所有賬戶在某天的最新修改的記錄
其中,某些賬戶在同一天內可能不止修改一次。
把此查詢按討論中簡化一下,建一數據表
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自身的查詢方法,效率會高些,但是給移稙帶來不利影響
子查詢的優點是可用於任何數據庫,但是效率差些