Возможно, у вас есть таблица с четким списком городов? Учитывая, что у вас есть около 1000 измерений на город, решение оконной функции (такое как row_number (), rank () и т. Д.) Может не работать так же хорошо, как обычное агрегатное решение или эта версия APPLY:
SELECT
M.*
FROM
Towns T
OUTER APPLY (
SELECT TOP 1 * -- add 'WITH TIES' to the 'TOP 1' if you have/want ties on date.
FROM Measurement M
WHERE T.Town = M.Town
ORDER BY M.Date DESC
) M
Если нет списка городов, вы можете попробовать это, хотя я не знаю, как это сложится против простого ванильного агрегата + lookup:
SELECT
M.*
FROM
(SELECT DISTINCT Town FROM Towns) T
OUTER APPLY (
SELECT TOP 1 *
FROM Measurement M
WHERE T.Town = M.Town
ORDER BY M.Date DESC
) M
Производительность этих запросов будет полностью зависеть от индексов. Вам нужен один в [Город] как минимум, а вместо этого [Город, Дата] будет лучше. Если другие таблицы используют MeasurementID, но вы редко обращаетесь к таблице Measurement с помощью MeasurementID, затем отбросьте кластеризованный индекс, сделайте MeasurementID некластеризованным PK и добавьте (неуникальный) кластеризованный индекс для Town, Date. Если у вас нет других таблиц, использующих MeasurementID, то полностью удалите этот столбец - в этом случае это бесполезный синтетический / искусственный ключ, вздувающий вашу таблицу без всякой причины.
Эти рекомендуемые изменения в индексах помогут всем запросам в ответах здесь с использованием агрегатов или APPLY. Не уверен в их влиянии на функции управления окнами, это зависит от того, как оптимизатор разрабатывает планы выполнения (если он достаточно умен, чтобы понять, что ему нужен только доступ к максимальной дате и не касаться всех других строк, тогда тот же индекс повысит его невероятно, хотя я сомневаюсь, что оптимизатор может сделать это).
Кроме того, для повышения производительности я бы наверняка предложил таблицу Town с TownID вместо размещения всего города. Что если название города изменится? Переключение с 15 или около того байтов в среднем для каждого имени на только 4 байта для int TownID поможет скорости. (Хотя тестирование для того, чтобы доказать это наверняка).