Oracle初級入門 根據某欄位重複只取一條記錄,並計計算重複條數

來源:互聯網
上載者:User

標籤:

在平常開發中,去重複資料經常使用到,本人新手,接觸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初級入門 根據某欄位重複只取一條記錄,並計計算重複條數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.