簡體   English   中英

修改我的SQL Server查詢-有時返回太多行

[英]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_Group2REMITTANCE ,以及它們之間的關系,它不是真的有可能建議您如何引入匯款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的列來避免這種情況。

在兩組activebilled_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM