oracle over結合row_number分割槽進行資料去重處理
阿新 • • 發佈:2020-10-10
一、建立一個測試表A
CREATE TABLE A( ID INT, NAME VARCHAR2(20) );
二、向表中新增資料,且存在相同的資料
INSERT INTO A VALUES(1,'YUAN');
INSERT INTO A VALUES(1,'YUAN');
INSERT INTO A VALUES(1,'YUAN');
INSERT INTO A VALUES(2,'YUAN');
INSERT INTO A VALUES(3,'YUAN');
INSERT INTO A VALUES(4,'LI');
INSERT INTO A VALUES(5,'LI');
INSERT INTO A VALUES(6,'YANG');
查詢得到的結果如下:
三、現在我們要查詢Name不同的所有資料,每個資料只取一條,當面對這樣的需求時,可以使用row_number() 函式加 over()函式來解決。
(1) 首先我們要懂原理,原理就是按照某個欄位進行分割槽,將該欄位相同的資料進行標號處理,然後每個分割槽裡面只取第一個標號的資料即可達到目的,首先我們來對資料按照欄位NAME進行分割槽處理:
SELECT id,name ,row_number() over(partition by name order by id) as groupindex from A;
查詢得到的結果如下:
通過分割槽我們將NAME欄位相同的一行資料做了標記處理,接下來只需要取標記為1的那一行資料即可達到資料去重的目的。
(2)根據分割槽,獲取每個分割槽中對應分組下標的資料。
select * from (SELECT id,name ,row_number() over(partition by name order by id) as groupindex from A) B where b.groupindex=1 order by b.id; --這裡獲取的是分割槽中下標為1的那一條資料
執行結果如下: