[英]Modify my SQL Server query — returns too many rows sometimes
我需要更新以下查詢,以便每個父(領取)僅返回一個子記錄(匯款)。
表Remit_To_Activate的每項聲明僅包含一個日期/時間戳,這正是我想要的。
但是,當我將完整的匯款表加入到表中時,由於某些索賠具有相同日期/時間戳的多個匯款,因此最外面的查詢為每個索賠ID返回多於1行。
SELECT * FROM REMITTANCE
WHERE BILLED_AMOUNT>0 AND ACTIVE=0
AND REMITTANCE_UUID IN (
SELECT REMITTANCE_UUID FROM Claims_Group2 G2
INNER JOIN Remit_To_Activate t ON (
(t.ClaimID = G2.CLAIM_ID) AND
(t.DATE_OF_LATEST_REGULAR_REMIT = G2.CREATE_DATETIME)
)
where ACTIVE=0 and BILLED_AMOUNT>0
)
我相信如果將REMITTANCE_UUID作為Remit_To_Activate中的一列包括在內,該問題將得到解決。 那是真正的問題。 這就是我創建Remit_To_Activate表的方式(試圖獲取索賠的最新匯款):
SELECT MAX(create_datetime) as DATE_OF_LATEST_REMIT,
MAX(claim_id) AS ClaimID,
INTO Latest_Remit_To_Activate
FROM Claims_Group2
WHERE BILLED_AMOUNT>0
GROUP BY Claim_ID
ORDER BY Claim_ID
Claims_Group2包含以下字段:REMITTANCE_UUID,CLAIM_ID,BILLED_AMOUNT,CREATE_DATETIME
這是當前給我帶來問題的兩行-它們都是SAME索賠和SAME TIMESTAMP的匯款。 我只想在Remits_To_Activate表中選擇其中之一,因此每個聲明只能“激活”一個匯款: 在此處輸入圖片描述
您可以像這樣更改查詢:
SELECT
p.*, latest_remit.DATE_OF_LATEST_REMIT
FROM
Remittance AS p inner join
(SELECT MAX(create_datetime) as DATE_OF_LATEST_REMIT,
claim_id,
FROM Claims_Group2
WHERE BILLED_AMOUNT>0
GROUP BY Claim_ID
ORDER BY Claim_ID) as latest_remit
on latest_remit.claim_id = p.claim_id;
這只會給您一行。 未經測試(因此請運行並進行更改)。
而對數據庫的結構的詳細信息-尤其是結構Claims_Group2
和REMITTANCE
,以及它們之間的關系,它不是真的有可能建議您如何引入匯款UUID到DATE_OF_LATEST_REMIT
。
由於使用的是SQL Server中,但是,它是可以使用窗口函數引入合成手段中,同一時刻匯款中進行選擇。 例如,看起來您可以解決如下問題:
select *
from (
select
r.*,
row_number() over (partition by cg2.claim_id order by cg2.create_datetime desc) as rn
from
remittance r
join claims_group2 cg2
on r.remittance_uuid = cg2.remittance_uuid
where
r.active = 0
and r.billed_amount > 0
and cg2.active = 0
and cg2.billed_amount > 0
) t
where t.rn = 1
請注意,它完全不依賴於DATE_OF_LATEST_REMIT
表,因為它已包含DATE_OF_LATEST_REMIT
聯視圖中。 還要注意,這將在結果中引入額外的一列,盡管您可以通過枚舉外部select
子句中的表remittance
的列來避免這種情況。
在兩組active
和billed_amount
列上進行過濾似乎也很奇怪,但這似乎是在原始查詢中執行的。 鑒於此,我敦促您仔細檢查結果,因為將cg2
列上的過濾條件提升到remittance
連接的級別會產生一個結果,該結果可能返回原始查詢沒有的行(但每個行都不能超過一個) claim_id
)。
一位同事向我提供了這種解決方案的優雅演示。 我以前從未使用過“ over”或“ partition”。 很棒! 感謝John和Gaurasvsa的投入。
if OBJECT_ID('tempdb..#t') is not null
drop table #t
select *, ROW_NUMBER() over (partition by CLAIM_ID order by CLAIM_ID) as ROW_NUM
into #t
from
(
select '2018-08-15 13:07:50.933' as CREATE_DATE, 1 as CLAIM_ID, NEWID() as
REMIT_UUID
union select '2018-08-15 13:07:50.933', 1, NEWID()
union select '2017-12-31 10:00:00.000', 2, NEWID()
) x
select *
from #t
order by CLAIM_ID, ROW_NUM
select CREATE_DATE, MAX(CLAIM_ID), MAX(REMIT_UUID)
from #t
where ROW_NUM = 1
group by CREATE_DATE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.