sql消除了Max Date的重复项

时间:2012-03-06 15:58:21

标签: sql

我有以下查询:

(
 Select Event.EventID, Event_Reps.LastName , Event_reps.FirstName, Cost.EventDate
 From Cost WITH(NOLOCK) 
 inner join Event WITH(NOLOCK) on Cost.EventID = Event.EventID 
 inner join Event_Reps WITH(NOLOCK) on Cost.EventRep = Event_Reps.EventRep 
 where Event.EventID = 66
 and Event_Reps.Division = 'Houston' and Cost.CostAmt = 0 
 ) as table1

由于给定EventID的Cost表中有重复记录,我需要找到具有最大EventDate的记录。 我不知道如何更改上面的查询,以便它执行它的功能,但消除了重复项,并为我提供了具有最大EventDate的Cost记录。

1 个答案:

答案 0 :(得分:1)

为猫皮肤设计的方法很多......测试每一种方法,找出哪种方法可以更好地使用您的桌面设计和RDBMS。我很确定我也错过了一些方法。

WINDOWED FUNCTIONS

SELECT  *
FROM    (   SELECT  Event.EventID, 
                    Event_Reps.LastName , 
                    Event_reps.FirstName, 
                    Cost.EventDate, 
                    MAX(Cost.EventDate) OVER(PARTITION BY EventID) [MaxEventDate]
            FROM    Cost WITH(NOLOCK) 
                    INNER JOIN Event WITH(NOLOCK) 
                        ON Cost.EventID = Event.EventID 
                    INNER JOIN Event_Reps WITH(NOLOCK) 
                        ON Cost.EventRep = Event_Reps.EventRep 
            WHERE   Event.EventID = 66
            AND     Event_Reps.Division = 'Houston' 
            AND     Cost.CostAmt = 0 
        ) as table1
WHERE   MaxEventDate = EventDate

SELECT  *
FROM    (   SELECT  Event.EventID, 
                    Event_Reps.LastName , 
                    Event_reps.FirstName, 
                    Cost.EventDate,
                    ROW_NUMBER() OVER(PARTITION BY EventID ORDER BY Cost.EventID) [RowNumber]
            FROM    Cost WITH(NOLOCK) 
                    INNER JOIN Event WITH(NOLOCK) 
                        ON Cost.EventID = Event.EventID 
                    INNER JOIN Event_Reps WITH(NOLOCK) 
                        ON Cost.EventRep = Event_Reps.EventRep 
            WHERE   Event.EventID = 66
            AND     Event_Reps.Division = 'Houston' 
            AND     Cost.CostAmt = 0 
        ) as table1
WHERE   RowNumber = 1

OR AGGREGATES

SELECT  *
FROM    (   SELECT  Event.EventID, 
                    Event_Reps.LastName , 
                    Event_reps.FirstName, 
                    Cost.EventDate,
                    ROW_NUMBER() OVER(PARTITION BY EventID ORDER BY Cost.EventID) [RowNumber]
            FROM    Cost WITH(NOLOCK) 
                    INNER JOIN Event WITH(NOLOCK) 
                        ON Cost.EventID = Event.EventID 
                    INNER JOIN Event_Reps WITH(NOLOCK) 
                        ON Cost.EventRep = Event_Reps.EventRep 
                    INNER JOIN
                    (   SELECT  EventID, MAX(EventDate) [EventDate]
                        FROM    Cost
                        GROUP BY EventID
                    ) MaxCost
                        ON MaxCost.EventID = Cost.EventID
                        AND MaxCost.EventDate = Cost.EventDate
            WHERE   Event.EventID = 66
            AND     Event_Reps.Division = 'Houston' 
            AND     Cost.CostAmt = 0 
        ) as table1

OR JOINS

SELECT  *
FROM    (   SELECT  Event.EventID, 
                    Event_Reps.LastName , 
                    Event_reps.FirstName, 
                    Cost.EventDate,
                    ROW_NUMBER() OVER(PARTITION BY EventID ORDER BY Cost.EventID) [RowNumber]
            FROM    Cost WITH(NOLOCK) 
                    INNER JOIN Event WITH(NOLOCK) 
                        ON Cost.EventID = Event.EventID 
                    INNER JOIN Event_Reps WITH(NOLOCK) 
                        ON Cost.EventRep = Event_Reps.EventRep 
                    LEFT JOIN Cost c2
                        ON c2.EventID = Cost.EventID
                        AND c2.EventDate > Cost.EventDate
            WHERE   Event.EventID = 66
            AND     Event_Reps.Division = 'Houston' 
            AND     Cost.CostAmt = 0 
            AND     Cost.EventID IS NULL
        ) as table1

或EX EXISTS

SELECT  *
FROM    (   SELECT  Event.EventID, 
                    Event_Reps.LastName , 
                    Event_reps.FirstName, 
                    Cost.EventDate,
                    ROW_NUMBER() OVER(PARTITION BY EventID ORDER BY Cost.EventID) [RowNumber]
            FROM    Cost WITH(NOLOCK) 
                    INNER JOIN Event WITH(NOLOCK) 
                        ON Cost.EventID = Event.EventID 
                    INNER JOIN Event_Reps WITH(NOLOCK) 
                        ON Cost.EventRep = Event_Reps.EventRep 
            WHERE   Event.EventID = 66
            AND     Event_Reps.Division = 'Houston' 
            AND     Cost.CostAmt = 0 
            AND     NOT EXISTS
                    (   SELECT  1
                        FROM    Cost c2
                        WHERE   c2.EventID = Cost.EventID
                        AND     c2.EventDate > Cost.EventDate
                    )
        ) as table1