[英]Left join with right table top 1 values
我正在將一個約有4MM行的帳戶主表與一個事務表連接起來。 我的問題是,當我對交易表中的帳號進行左連接=從帳戶主表中的帳號進行連接時,我發現我們的數據中存在異常。 我可以在帳戶管理員中為同一帳號輸入3個不同的條目。 這些與帳戶的特征有關。 異常之處在於地址信息可能相同,但在某些情況下,我看到城市的拼寫有所不同。 當我加入兩個表時,我只想要帳戶主帳戶中帳號的第一個實例。 我已經看到了一些關於使用row_number()的帖子,但是我在這里無法正確使用它。 這就是我使用的,但是每個帳號都有3條記錄。
select am.[Customer_Name], am.[svc_city], sr.measure
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr
left join [CIS].[dbo].[Account_Master] am on
(case when (left(sr.fred_account_number,2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2)))
when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number,len(sr.fred_account_number - 1)))
else sr.fred_account_number
end)
= (select am.accountnumber, row_number() over (order by am.accountnumber) as row) where row = 1
and sr.fred_account_number = '123456789'
首先,如果同一帳戶有多個記錄,則需要翻新數據庫架構和/或使用該數據庫的應用程序。
無論如何,僅選擇幾個“類似”記錄中的一個,就可以按照以下步驟做一些事情(從查詢中簡化)
with
acc_with_ord as (
select
col1, col2,...,
row_number() over (partition by <uniquely identifying columns> order by <some columns>) as ord
from
AccountMaster
),
unq_acc as (
select * from acc_with_ord where ord = 1
)
select <something>
from
pp_summary_residential
left join unq_acc on
<join conditions>
第一部分為描述同一帳戶的記錄分配代理訂單ID(因為我們按一些唯一標識該帳戶的字段進行了分區),第二部分為每個帳戶僅選擇一條記錄,第三部分是使用唯一帳戶的最終選擇加入中的帳戶記錄。
我建議使用outer apply
:
select am.[Customer_Name], am.[svc_city], sr.measure
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr outer apply
(select top 1 am.*
from [CIS].[dbo].[Account_Master] am
where (case when (left(sr.fred_account_number, 2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2)))
when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number, len(sr.fred_account_number - 1)))
else sr.fred_account_number
end)
order by am.account_number
) am;
這將從am
選擇一行,其中一行取決於order by
的order by
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.