2013-08-21 10 views
2

У меня есть следующий запрос:SQL Server Max Функция

SELECT 
a.name, a.address, n.date, n.note 
FROM a 
LEFT JOIN n ON a.id = n.id 

a.id имеет один ко многим отношений с n.id, так что многие ноты могут быть assocaited с одним именем.

Как вернуть только последнее примечание для каждого имени вместо всех заметок?

Я использую SQL Server 2008.

Спасибо.

ответ

5

Вот один из способов использования ROW_NUMBER()

SELECT t.name, t.address, t.date, t.note 
FROM (
    SELECT 
     a.name, a.address, n.date, n.note, 
     ROW_NUMBER() OVER (PARTITION BY a.name ORDER BY n.date DESC) rn 
    FROM a 
    LEFT JOIN n ON a.id = n.id 
) t 
WHERE t.rn = 1 

альтернативы вы можете использовать коррелированный подзапрос тоже получить максимальную дату, что-то вроде этого

SELECT 
    a.name, a.address, n.date, n.note 
FROM a 
LEFT JOIN n ON a.id = n.id 
WHERE n.date = (SELECT MAX(nn.date) 
       FROM n AS nn 
       WHERE a.id = nn.id) 
+0

Хорошего ответа, но, возможно, излишние? – JsonStatham

+0

@SelectDistinct у вас есть более простой способ добиться желаемого результата? Если да, почему бы не опубликовать ответ или не уточнить, почему вы считаете, что это излишне. –

+0

Hi T I, Спасибо за ваш ответ. Сценарий на самом деле является упрощенной версией более крупного и сложного запроса, включающего множество таблиц и объединений. Есть ли альтернатива наличию всего запроса в подзапросе предложения From, поскольку это означает, что любое изменение в поле, объединение и т. Д. Должно выполняться дважды? Благодарю. – user2493043