Как мне удалить дубликаты результатов поиска максимальной даты? - PullRequest
0 голосов
/ 20 января 2012

Я знаю, что у меня есть повторяющиеся результаты этого запроса, потому что таблицы 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 Ответ

1 голос
/ 20 января 2012

Брайан,

Мне забавно, что вы делаете это в MS SQL, и в таблицах ReleaseHistory и IterationHistory всегда будет хотя бы одна запись.Если предположения верны, вы можете просто использовать CROSS APPLY, чтобы получить первую первую запись из обеих таблиц.

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
...