簡體   English   中英

選擇SQL連接語句上一對多關系的最上面匹配記錄

[英]Selecting the top matching record of a one to many relationship on a SQL join statement

我有一個問題,可能會很簡單,但無論如何我都不是SQL專家。 我的查詢具有3個聯接,第3個是一對多關系,並且我試圖獲得前1個。在這種情況下,這將是對支持電話的最后一次編輯。

該信息來自4個表,其中CASE用於基本案例詳細信息,CONTACT1和CONTACT2用於聯系信息,以及該案例注釋的NOTES,該NOTES表為在這種情況下輸入的每個注釋創建1個條目。 我想創建一個儀表板,其中將包含最后一個輸入時間戳。

我試圖在聯接中添加一個選擇頂部(1),嘗試了聯接的所有可能選項,並將Max(C3.MODIFIEDDATE)與Group By一起使用,但是我總是以每張票證中NOTES的所有記錄為最終結果。

這是我的查詢:

SELECT c.NUMBER as [Case Number], c.OWNER as [Assigned To], case c.status when 0 then '<unknown>' when 1 then 'Assigned' when 2 then 'Reassigned' when 3 then 'Escalated' when 4 then 'Resolved' 
else cast(c.status as varchar(50)) end as [Case Status], c.SUBJECT as [Subject], c.OFFERING as [Next Step], DATEADD(day,DATEDIFF(day,0,c.CREATED_DATE),0) as [Created on], c1.CONTACT 
as [Primary Contact], c1.COMPANY as [Company], c3.MODIFIEDDATE as [Last Edit], c3.MODIFIEDBY as [Last Agent]

FROM CASES c left join(CONTACT1 c1 inner join CONTACT2 c2 on c1.ACCOUNTNO = c2.ACCOUNTNO ) on c1.ACCOUNTNO = c.ACCOUNTNO 
   left join NOTES as c3 on c3.LOPRECID =c.recid -- That's the one that has a 1 to many resolve


WHERE (  c.IS_TEMPLATE = 0  AND   c.STATUS IN ( 1,2,3 ) and c3.rectype='CS' )
ORDER BY [Company] asc, c3.modifieddate desc

任何建議將不勝感激

一種方式(也有其他方式)替換

left join NOTES as c3 on c3.LOPRECID =c.recid

OUTER APPLY (SELECT TOP 1 MODIFIEDDATE, MODIFIEDBY 
             FROM NOTES AS N 
             WHERE N.LOPRECID = c.recid AND N.rectype='CS'
             ORDER BY MODIFIEDDATE DESC
) AS c3

並從WHERE子句中刪除c3.rectype='CS'

在NOTES中沒有滿足rectype ='CS'要求的行的情況下,您將需要確保獲得期望的結果,因為這會為您的要求在齒輪中添加一些沙子。

LEFT JOIN 
(
   SELECT LOPRECID, MODIFIEDDATE, MODIFIEDBY, 
     rn = ROW_NUMBER() OVER (PARTITION BY LOPRECID ORDER BY MODIFIEDDATE DESC)
   FROM dbo.Notes
) AS C3
ON C3.LOPRECID = c.recid AND C3.rn = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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