我有以下查询:
(
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记录。
答案 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