Sql 左侧外部联接视图中的最大日期

Sql 左侧外部联接视图中的最大日期,sql,tsql,Sql,Tsql,由于前面的问题,我发现了如何基于链接表提取最新数据。但是,现在我有一个相关的问题 我找到的解决方案使用row_number()和PARTITION来提取最新的数据集。但是,如果视图中的链接表中可能有零行或多行,该怎么办?例如,表FollowUpDate可能有0行、1行或更多行。我只想要最新的以下更新: SELECT EFD.FormId ,EFD.StatusName ,MAX(EFD.ActionDate) ,EFT.Name AS FormType

由于前面的问题,我发现了如何基于链接表提取最新数据。但是,现在我有一个相关的问题

我找到的解决方案使用row_number()和PARTITION来提取最新的数据集。但是,如果视图中的链接表中可能有零行或多行,该怎么办?例如,表FollowUpDate可能有0行、1行或更多行。我只想要最新的以下更新:

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()和PARTITION进行类似的拉取,那么只有当FollowUpDate中至少有一行时,我才能获取数据。有点违背了左外连接的目的。有人能帮我工作吗?

如果没有表定义和示例数据,很难猜测发生了什么

此外,这也令人困惑:“表FollowUpDate可能有0行”和“需要最新的FollowUpDate”。(尤其是在没有名为FollowUpDate的表时)如果没有FollowUpDate,则没有“最新的FollowUpDate”

也许你想要

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

我重写了您的查询-您进行了不必要的子选择,并对FUDateSortKey使用了row_number(),但没有使用列:

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表上使用一个左联接-您正在进行一个内部联接,因此您只能得到与FORMFOLLOWUP记录相关联的行。

我找到了答案。和往常一样,我需要小睡一会儿。我只需要将我的subselect更改为我发誓我尝试过但没有成功的东西:

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

这太棒了!我将充实这一点,以适应整个视图;它看起来比我现在使用的要快很多。