2009-08-18 76 views
0

感謝上一個問題,我發現如何根據鏈接表提取最新數據。但是,現在我有一個相關的問題。左外連接中的最大日期

我找到的解決方案使用了row_number()和PARTITION來提取最近一組數據。但是如果視圖中的鏈接表中有零個或多個行的可能性呢?例如,表FollowUpDate可能有0行,或1或更多。我只是想最近FollowUpDate:

SELECT 
    EFD.FormId 
    ,EFD.StatusName 
    ,MAX(EFD.ActionDate) 
    ,EFT.Name AS FormType 
    ,ECOA.Account AS ChargeOffAccount 
    ,ERC.Name AS ReasonCode 
    ,EAC.Description AS ApprovalCode 
    ,MAX(EFU.FollowUpDate) AS FollowUpDate 
FROM (
    SELECT EF.FormId, EFD.ActionDate, EFS.Name AS StatusName, EF.FormTypeId, EF.ChargeOffId, EF.ReasonCodeId, EF.ApprovalCodeId, 
     row_number() OVER (PARTITION BY EF.FormId ORDER BY EFD.ActionDate DESC) DateSortKey 
    FROM Extension.FormDate EFD INNER JOIN Extension.Form EF ON EFD.FormId = EF.FormId INNER JOIN Extension.FormStatus EFS ON EFD.StatusId = EFS.StatusId 
) EFD 
    INNER JOIN Extension.FormType EFT ON EFD.FormTypeId = EFT.FormTypeId 
    LEFT OUTER JOIN Extension.ChargeOffAccount ECOA ON EFD.ChargeOffId = ECOA.ChargeOffId 
    LEFT OUTER JOIN Extension.ReasonCode ERC ON EFD.ReasonCodeId = ERC.ReasonCodeId 
    LEFT OUTER JOIN Extension.ApprovalCode EAC ON EFD.ApprovalCodeId = EAC.ApprovalCodeId 
    LEFT OUTER JOIN (Select EFU.FormId, EFU.FollowUpDate, row_number() OVER (PARTITION BY EFU.FormId ORDER BY EFU.FollowUpDate DESC) FUDateSortKey FROM Extension.FormFollowUp EFU INNER JOIN Extension.Form EF ON EFU.FormId = EF.FormId) EFU ON EFD.FormId = EFU.FormId 
WHERE EFD.DateSortKey = 1 
GROUP BY 
    EFD.FormId, EFD.ActionDate, EFD.StatusName, EFT.Name, ECOA.Account, ERC.Name, EAC.Description, EFU.FollowUpDate 
ORDER BY 
    EFD.FormId 

如果我做了類似的使用上拉ROW_NUMBER()和分區,我得到的數據只是如果在FollowUpDate至少一行。有點擊敗了左外連接的目的。任何人都可以幫助我做到這一點?

回答

1

我改寫了您的查詢 - 你有不必要的子查詢,並用ROW_NUMBER()爲FUDat​​eSortKey但沒有使用的列:

SELECT t.formid, 
    t.statusname, 
    MAX(t.actiondate) 'actiondate', 
    t.formtype, 
    t.chargeoffaccount, 
    t.reasoncode, 
    t.approvalcode, 
    MAX(t.followupdate) 'followupdate' 
FROM (
    SELECT t.formid, 
      fs.name 'StatusName', 
      t.actiondate, 
      ft.name 'formtype', 
      coa.account 'ChargeOffAccount', 
      rc.name 'ReasonCode', 
      ac.description 'ApprovalCode', 
      ffu.followupdate, 
      row_number() OVER (PARTITION BY ef.formid ORDER BY t.actiondate DESC) 'DateSortKey' 
    FROM EXTENSION.FORMDATE t 
    JOIN EXTENSION.FORM ef ON ef.formid = t.formid 
    JOIN EXTENSION.FORMSTATUS fs ON fs.statusid = t.statusid 
    JOIN EXTENSION.FORMTYPE ft ON ft.formtypeid = ef.formtypeid 
LEFT JOIN EXTENSION.CHARGEOFFACCOUNT coa ON coa.chargeoffid = ef.chargeoffid 
LEFT JOIN EXTENSION.REASONCODE rc ON rc.reasoncodeid = ef.reasoncodeid 
LEFT JOIN EXTENSION.APPROVALCODE ac ON ac.approvalcodeid = ef.approvalcodeid 
LEFT JOIN EXTENSION.FORMFOLLOWUP ffu ON ffu.formid = t.formid) t 
    WHERE t.datesortkey = 1 
GROUP BY t.formid, t.statusname, t.formtype, t.chargeoffaccount, t.reasoncode, t.approvalcode 
ORDER BY t.formid 

改變我允許FollowUpDate是在FORMFOLLOWUP表上使用一個LEFT JOIN--你正在做一個INNER JOIN,所以你只能得到FORMFOLLOWUP記錄關聯的行。

+0

這太棒了!我打算爲了適應整個觀點而對這一個進行充實;它看起來比我現在用很長的一段時間工作得更快。 – Valkyrie 2009-08-18 18:03:54

0

如果沒有表格定義和樣本數據,很難猜測發生了什麼。

此外,這是令人困惑的:「表FollowUpDate可能有0行」,你「希望最新的FollowUpDate」。 (特別是當沒有名爲FollowUpDate的表時)如果沒有FollowUpDate,則沒有「最近的FollowUpDate」。

也許你想

WHERE <follow up date row number> in (1,NULL) 
0

我想通了。和往常一樣,我需要小睡一下。我只是需要改變我的選擇,我會發誓我試過沒有成功:

SELECT field1, field2  
FROM Table1 t1  
LEFT JOIN ( 
     SELECT field3, max(dateColumn)  
     FROM Table2  
     GROUP BY  
      field3  
) t2  
ON (t1.field1 = t2.field3)