如何通过查找最大日期来删除重复的结果?

时间:2012-01-20 17:45:54

标签: sql sql-server-2008 date max

我知道此查询的结果重复,因为表ReleaseHistory和IterationHistory每个ReleaseID和IterationID都有多个记录。我想只从dbo.ReleaseHistory和dbo.IterationHistory中选择最大日期的记录。我将如何在此查询中执行此操作? SQL SERVER 2008

SELECT     dbo.Assignable.AssignableID AS ID,
           dbo.EntityType.Abbreviation AS Entity, 
           dbo.General.Name, dbo.Assignable.Effort, 
           dbo.Assignable.EffortCompleted, 
           dbo.Assignable.EffortToDo, 
           dbo.EntityState.Name AS State, 
           dbo.ReleaseHistory.Name AS Release,   
           dbo.IterationHistory.Name AS Iteration, 
           dbo.General.CustomField3 AS [Scrum Team]
FROM       dbo.Assignable INNER JOIN
           dbo.General ON dbo.Assignable.AssignableID = 
             dbo.General.GeneralID INNER JOIN
           dbo.EntityType ON dbo.General.EntityTypeID = 
             dbo.EntityType.EntityTypeID INNER JOIN
           dbo.EntityState ON dbo.Assignable.EntityStateID = 
             dbo.EntityState.EntityStateID AND 
           dbo.EntityType.EntityTypeID = 
             dbo.EntityState.EntityTypeID INNER JOIN
           dbo.ReleaseHistory ON dbo.Assignable.ReleaseID = 
             dbo.ReleaseHistory.ReleaseID INNER JOIN
           dbo.IterationHistory ON 
             dbo.Assignable.IterationID = 
             dbo.IterationHistory.IterationID LEFT OUTER JOIN
           dbo.CustomField ON dbo.General.CustomField3 = 
             dbo.CustomField.CustomFieldID
WHERE     (dbo.Assignable.ProjectID = 4054)
GROUP BY dbo.Assignable.AssignableID, 
           dbo.EntityType.Abbreviation, 
           dbo.General.Name, 
           dbo.Assignable.Effort, 
           dbo.Assignable.EffortCompleted, 
           dbo.Assignable.EffortToDo, 
           dbo.EntityState.Name, 
           dbo.ReleaseHistory.Name, 
           dbo.IterationHistory.Name, 
           dbo.General.CustomField3

1 个答案:

答案 0 :(得分:1)

布赖恩,

我很有趣你在MS SQL中这样做,并且在ReleaseHistory和IterationHistory表中总会有至少一条记录。如果假设是正确的,那么您只需使用CROSS APPLY从两个表中获取前1个记录。

SELECT
    dbo.Assignable.AssignableID AS ID ,
    dbo.EntityType.Abbreviation AS Entity ,
    dbo.General.Name ,
    dbo.Assignable.Effort ,
    dbo.Assignable.EffortCompleted ,
    dbo.Assignable.EffortToDo ,
    dbo.EntityState.Name AS State ,
    Release ,
    Iteration ,
    dbo.General.CustomField3 AS [Scrum Team]
FROM
    dbo.Assignable 

    INNER JOIN dbo.General ON  dbo.Assignable.AssignableID = dbo.General.GeneralID 
    INNER JOIN dbo.EntityType ON  dbo.General.EntityTypeID = dbo.EntityType.EntityTypeID 
    INNER JOIN dbo.EntityState ON  dbo.Assignable.EntityStateID = dbo.EntityState.EntityStateID 
        AND dbo.EntityType.EntityTypeID = dbo.EntityState.EntityTypeID 
    CROSS APPLY( SELECT TOP 1 name Release FROM ReleaseHistory WHERE ReleaseID = Assignable.ReleaseID ORDER BY MaxDateColumn) a
    CROSS APPLY( SELECT TOP 1 name Iteration FROM IterationHistory WHERE IterationID = Assignable.IterationID ORDER BY MaxDateColumn) b
    LEFT OUTER JOIN dbo.CustomField ON  dbo.General.CustomField3 = dbo.CustomField.CustomFieldID
WHERE
    ( dbo.Assignable.ProjectID = 4054 )
GROUP BY
    dbo.Assignable.AssignableID ,
    dbo.EntityType.Abbreviation ,
    dbo.General.Name ,
    dbo.Assignable.Effort ,
    dbo.Assignable.EffortCompleted ,
    dbo.Assignable.EffortToDo ,
    dbo.EntityState.Name ,
    dbo.ReleaseHistory.Name ,
    dbo.IterationHistory.Name ,
    dbo.General.CustomField3