1. 程式人生 > 實用技巧 >oracle over結合row_number分割槽進行資料去重處理

oracle over結合row_number分割槽進行資料去重處理

一、建立一個測試表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的那一條資料

執行結果如下: