Какая версия SQL Server?
SQL 2005 и выше:
SELECT *
FROM
(SELECT Item = Row_Number() OVER (PARTITION BY [name] ORDER BY [date] DESC), * FROM test) X
WHERE Item = 1
SQL 2000:
SELECT T.*
FROM
test T
INNER JOIN (
SELECT [name], MaxDt = Max([date]) FROM test GROUP BY [name]
) X ON T.[name] = X.[name] AND T.[date] = X.MaxDt
Если у вас могут быть повторяющиеся даты, то для версии sql 2000 необходим еще один шаг, чтобы сократить ее до одной строки.
@Oded указал, что вы можете просто получить максимальную дату. Если все, что вам нужно, это имя и дата, то лучше всего подойдет его запрос. Но если мое подозрение верно, что вам нужно больше элементов из той же строки, то вам понадобятся такие запросы.
Вот еще одна версия SQL 2005:
SELECT
T.*
FROM
test T
CROSS APPLY (
SELECT TOP 1 [date]
FROM test T2
WHERE T.[name] = T2.[name]
ORDER BY T2.[date] DESC
) X
WHERE
T.[date] = X.[date]
Этот запрос будет иметь проблемы с повторяющимися максимальными датами для одного и того же имени.
Обновить
Теперь, когда я знаю, что это SQL 2008:
Решение row_number() самое простое и легкое. Я бы начал с этого. Если производительности недостаточно, а таблица является дочерней по отношению к родительской таблице, в которой каждое [имя] встречается только один раз, попробуйте решение CROSS APPLY с внешней таблицей (тест T) в качестве родителя:
SELECT
X.*
FROM
Parent P
CROSS APPLY (
SELECT TOP 1 *
FROM test T
WHERE P.[name] = T.[name]
ORDER BY T.[date] DESC
) X
Если родительской таблицы нет, вы можете попробовать указанные выше запросы или использовать SELECT DISTINCT [name] FROM test
, но я не уверен, что это улучшит производительность:
SELECT
X.*
FROM
(SELECT DISTINCT [name] FROM test) P
CROSS APPLY (
SELECT TOP 1 *
FROM test T
WHERE P.[name] = T.[name]
ORDER BY T.[date] DESC
) X
person
ErikE
schedule
02.09.2010