1. 程式人生 > >oracle過濾某個欄位重複記錄,只獲取一條記錄

oracle過濾某個欄位重複記錄,只獲取一條記錄

oracle過濾某個欄位重複記錄,只獲取一條記錄

一,首先想到:

1,關鍵字distinct

2,group by

3,MAX,MIN這樣的函式被稱為聚集函式,和GROUP搭配起來用

但均無法實現,執行結果如下

舉例:

表名:OffsiteOutreachTeam_List

欄位:CORPADDLEVEL(獲取該欄位不重複資料),CHANNELCODE, CORPNAME, BELONGORGNAME

執行結果:

1,distinct

--一個欄位有效,多個欄位無效

select distinct CORPADDLEVEL from OffsiteOutreachTeam_List;

select distinct CORPADDLEVEL ,CHANNELCODE, CORPNAME, BELONGORGNAME from OffsiteOutreachTeam_List;

注意:當除了過濾欄位外的其他所有欄位內容相同時,才可以起到過濾效果。

2,group by

--只能查詢一個欄位

select CORPADDLEVEL from OffsiteOutreachTeam_List group by CORPADDLEVEL; --報錯 not a group by expression

select CORPADDLEVEL,CHANNELCODE, CORPNAME, BELONGORGNAME from OffsiteOutreachTeam_List group by CORPADDLEVEL;

3,MAX,MIN這樣的函式被稱為聚集函式,和GROUP搭配起來用

--只能過濾兩個欄位

SELECT MIN(CHANNELCODE), CORPADDLEVEL FROM OffsiteOutreachTeam_List GROUP BY CORPADDLEVEL --報錯 not a group by expression

SELECT MIN(CHANNELCODE), CORPADDLEVEL,CORPNAME, BELONGORGNAME FROM OffsiteOutreachTeam_List GROUP BY CORPADDLEVEL

二,正確方式

1,關鍵字 row_number() OVER(PARTITION BY 使用子查詢對重複資料按照123...排序,再條件需要為1的。

select  CORPADDLEVEL ,CHANNELCODE, CORPNAME, BELONGORGNAME 
from(select ol.CORPADDLEVEL,ol.CHANNELCODE, ol.CORPNAME, ol.BELONGORGNAME, row_number() OVER(PARTITION BY ol.CORPADDLEVELORDER BY ol.CORPADDLEVEL) ds 
from OffsiteOutreachTeam_List ol
where ol.CORPADDLEVEL is not null)
where ds = 1

2,使用min group by進行子查詢,獲取唯一欄位,再查詢所有欄位。
select  CORPADDLEVEL ,CHANNELCODE, CORPNAME, BELONGORGNAME from OffsiteOutreachTeam_List where CHANNELCODE in
(select min(CHANNELCODE) from OffsiteOutreachTeam_List group by CORPADDLEVEL) order by CORPADDLEVEL;