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

时间:2018-06-26 07:02:21

标签: sql sql-server sql-server-2008-r2

我知道之前曾有人问过这个问题,我看过很多解决方案,但是我无法采用任何解决方案来解决我的问题。 我想返回具有最大日期的每个公司和ComplianceTypeID的行。

此查询显示我的数据。

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

返回此结果

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

我只想返回每个ComplianceTypeID中日期最高的行

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

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

我已经尝试过了,但是只返回了5行,所有日期都为'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

似乎还有许多其他方法可以解决此问题。 我只需要一个有效的方法就可以了:)我已经紧张了半天,没有进步。

感谢您的协助 大卫

1 个答案:

答案 0 :(得分:2)

通常通过窗口函数来处理。

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

最后,这也可以通过派生表和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]