今天學了一句sql和大家分享一下:
oracle數據庫,情景:表(客戶-業務員)中數據都不完全重複,但是可能多條數據其中某些字段重複。我想要取得表中符合條件的記錄,但是這些記錄中的客戶id和客戶名稱發生重複的話只能留一個。
如上圖我想找出“馮冬梅”負責的所有客戶,但是由於她屬於多個部門,此表存儲的是不同部門-不同人員對應的不同客戶,所以會有重複數據,那麼我想去除重複得到完整的記錄,應該怎麼辦?
自己嘗試了distinct,可是distinct只能曬出重複字段,整條記錄就沒有辦法;使用group by也沒有實現,多方查找,sql貢獻如下:
select s.* from
(select t.*,row_number() over (partition by customid order by customid) as group_idx
from base_custom_to_saler t where t.salername like ‘%馮冬梅%’ and t.entryid = 9) s
where s.group_idx = 1
row_number()..over(partition by ..order by…) 其邏輯就是對符合某些特點的字段進行分組,排序,然後再取數據
結果如下圖:
謝謝博主,參考上面,我寫成自己需要的sql語句:
select id 崗位id
,code,name as 崗位code,org_id 機構id,org_name 機構名稱,area 區域,
names 人員姓名,login_id 工號,
client_id 客戶id,client_code 客戶代碼,client_name 客戶名稱,post_id 崗位id,
post_name 崗位名稱,bank_name 銀行名稱,
bank_detail_name 開戶行,account 銀行賬號,account_name 銀行賬號名稱,payment_method 支付方式,
group_idx
from
(select r.id,r.code,r.name,r.org_id,r.org_name,r.area,
u.name as names,u.login_id,
i.client_id,i.client_code,i.client_name,i.post_id,
i.post_name,i.bank_name,
i.bank_detail_name,i.account,i.account_name,i.payment_method,
row_number() over (partition by account order by account) as group_idx
from sec_role r,sec_user u,sec_user_role ur ,sys_payment_info i
where ur.user_id = u.id and ur.role_id = r.id and i.post_id = r.id and ur.begin_date is null
) where group_idx = 1