Select 具有最大日期和其他条件的行

Select the row with the maximum date and other criteria

我知道这个问题以前有人问过,我也看过很多解决方案,但我无法调整任何解决方案来解决我的问题。 我想 return 每个公司的行和具有最大日期的 complianceTypeID。

这个查询显示了我的数据。

    SELECT [ComplianceItemID]
      ,[CorporationID]
      ,[Date]
      ,[ComplianceTypeID]
  FROM [Compliance].[dbo].[ViewComplianceItem]
  Where CorporationID = '869'

Returns这个结果

ComplianceItemID    CorporationID       Date        ComplianceTypeID
55761               869                 2018-06-20  1
56840               869                 2022-11-07  2
57919               869                 1900-01-01  3
58998               869                 1900-01-01  4
60077               869                 1900-01-01  5
61156               869                 1900-01-01  6
62235               869                 1900-01-01  7
63316               869                 2018-06-25  8
63322               869                 2018-06-26  1

我只想 return 每个 ComplianceTypeID

中具有最高日期的行

稍后我将参数化查询而不是固定的 CoprorationID。

我希望看到 8 行 returned,应该排除第 1 行,因为还有另一个 ComplianceTypeID 1 的日期较新。

我试过了,但只有 5 行 returned 的日期都是“1900-01-01”

SELECT
    VC1.ComplianceItemID, 
    VC1.CorporationID, 
    VC1.[Date], 
    VC1.ComplianceTypeID 
FROM ViewComplianceItem VC1
Left Join ViewComplianceItem VC2 
    On VC1.ComplianceTypeID = VC2.ComplianceTypeID
    AND VC1.[Date] > VC2.[Date]
Where VC2.[Date] is null 
AND VC1.CorporationID = '869'

结果

ComplianceItemID    CorporationID       Date        ComplianceTypeID
57919               869                 1900-01-01  3
58998               869                 1900-01-01  4
60077               869                 1900-01-01  5
61156               869                 1900-01-01  6
62235               869                 1900-01-01  7

似乎有许多其他方法可以解决这个问题。 我只需要一个有效的 :) 我已经绞尽脑汁半天了,但没有任何进展。

感谢您的帮助 大卫

这通常由 window 函数处理。

create procedure my proc (@corpID int)
as
begin

    ;WITH CTE AS(
    SELECT 
        [ComplianceItemID]
        ,[CorporationID]
        ,[Date]
        ,[ComplianceTypeID]
        ,RN = row_number() over (partition by ComplianceTypeID order by [Date] desc)
    FROM [Compliance].[dbo].[ViewComplianceItem]
    WHERE CorporationID = @corpID)

    SELECT 
        [ComplianceItemID]
        ,[CorporationID]
        ,[Date]
        ,[ComplianceTypeID]
    FROM CTE
    WHERE RN = 1
end

您也可以不进行参数化,或忽略 WHERE 子句,并将其添加到 PARTITION BY 以恢复您对每个公司的逻辑。

WITH CTE AS(
SELECT 
    [ComplianceItemID]
    ,[CorporationID]
    ,[Date]
    ,[ComplianceTypeID]
    ,RN = row_number() over (partition by CorporationID, ComplianceTypeID order by [Date] desc)
FROM [Compliance].[dbo].[ViewComplianceItem])

SELECT 
    [ComplianceItemID]
    ,[CorporationID]
    ,[Date]
    ,[ComplianceTypeID]
FROM CTE
WHERE RN = 1

最后,这也可以用派生的 table 和 MAX 聚合来处理:

SELECT 
    t1.[ComplianceItemID]
    ,t1.[CorporationID]
    ,t1.[Date]
    ,t1.[ComplianceTypeID]
FROM [Compliance].[dbo].[ViewComplianceItem] t1
INNER JOIN (SELECT CorporationID, ComplianceItemID, MAX([Date]) dt
            FROM [Compliance].[dbo].[ViewComplianceItem]
            GROUP BY CorporationID, ComplianceItemID) t2 on
            t2.CorporationID = t1.CorporationID 
            and t2.ComplianceItemID = t1.ComplianceItemID
            and t2.dt = t1.[Date]