標籤:
在平常開發中,去重複資料經常使用到,本人新手,接觸Oracle也不久,開發中用到的小知識點,記錄一下,老鳥可繞道,如果有寫錯的,請指正。
去重複記錄可以使用distinct,當只查詢一列資料時,可以輕鬆去掉重複的資料,當查詢多列資料時,如果有一列的資料不相同,distinct則認為資料是不相同的,也就是資料將不會合并,這時類似是group by 某寫欄位的結果一樣,此時的結果可能不是我們想要的。下面說下查詢多列時去重複及合計重複記錄的條數。
當做個不同的連結查詢,得到的結果如下:
1 select2 rownum,3 z.zdbh, 4 z.adsljdsbmc,5 z.glwxtgdbh,6 sysdate7 from rebase_ztgd z left join rebase_dzgd d8 on z.glwxtgdbh=d.djbh
而如果這樣寫
selectrownum,z.zdbh, z.adsljdsbmc,z.glwxtgdbh,sysdatefrom rebase_ztgd z left join rebase_dzgd don z.glwxtgdbh=d.djbhwhere z.glwxtgdbh is not null and z.id in(select min(id) from rebase_ztgd b group by b.glwxtgdbh ) order by z.id desc;
重複資料只取一條,關鍵代碼是這裡:
z.id in(select min(id) from rebase_ztgd b group by b.glwxtgdbh )這句就是從重複的
glwxtgdbh欄位分組,然後取出最小ID的那條記錄,當然,裡邊不一定是使用min,也可以用Max
下面說下怎麼記錄重複記錄的條數:
首先看下這行SQL語句的效果:
select id,z.glwxtgdbh,row_number() over (order by id) x from rebase_ztgd z;
其實就是用到row_number()函數,根據ID排序,產生一列連續編號的列X
再看下面這行SQL語句:
select id,z.glwxtgdbh,row_number() over (partition by z.glwxtgdbh order by id) x from rebase_ztgd z;
這句大概意思是,用row_NUMBER()函數配合over彙總函式,對單列glwxtgdbh
分組 分組內按id排序:
然後看下上面兩個相減的結果:
select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z
大致意思是id排序值 減去glwxtgdbh
分組內id排序值 = 連續相同值的排序值
然後使用count函數就可以計算出每組的條數了
selectmax(zdbh),count(*),max(adsljdsbmc)節電裝置名稱,max(glwxtgdbh)關聯工單,sysdate from(select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z left join rebase_dzgd don z.glwxtgdbh=d.djbh)where glwxtgdbh is not nullgroup by xorder by min(id)
我想合并成這樣的
然後將兩個列合并下就可以了:如下
select to_char(rownum) 序號,t.* from(selectcase when count(*)=1 then max(zdbh)||‘有‘||count(*)||‘張‘ else max(zdbh)||‘等‘||count(*)||‘張‘ end 主單編號,max(adsljdsbmc)節電裝置名稱,max(glwxtgdbh)關聯工單,sysdate from(select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z left join rebase_dzgd don z.glwxtgdbh=d.djbh)where glwxtgdbh is not nullgroup by xorder by min(id))tunion allselect ‘合計‘序號,‘33‘,‘‘,‘‘,sysdate from dual
效果如下:
這樣就完成了。。
擷取重複資料可用:
select * from rebase_ztgd where glwxtgdbh in ( select glwxtgdbh from rebase_ztgd group by glwxtgdbh having count(id) > 1 )
Oracle初級入門 根據某欄位重複只取一條記錄,並計計算重複條數