2012-03-06 10 views
0

У меня есть следующий запрос:SQL устранить dupliates с Max Дата

(
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, мне нужно, чтобы найти тот, который имеет наибольшее EVENTDATE. Я не уверен, как изменить вышеприведенный запрос таким образом, чтобы он выполнял то, что он делает, но устраняет дубликаты и дает мне запись о расходах с максимальным событием EventDate.

+2

Какую версию SQL вы используете? –

+1

** Что ** система баз данных, а какая версия? ** SQL ** - это только язык структурированных запросов - язык, используемый многими системами баз данных - SQL - это ** НЕ ** продукт базы данных ... такие вещи, как это очень часто зависят от поставщика, - поэтому нам действительно нужно знать, что система баз данных, которую вы используете. –

ответ

1

Так много способов кошки кошки ... Протестируйте каждый, чтобы узнать, что лучше работает с вашим дизайном стола и РСУБД. Я уверен, что тоже пропустил некоторые пути.

оконном ФУНКЦИИ

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 

ИЛИ агрегатах

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 

ИЛИ СТАЛ

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 

ИЛИ СУЩЕСТВУЕТ

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 
Смежные вопросы