町の個別のリストを含むテーブルを持っている可能性がありますか? 町ごとに約 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
町のリストがない場合は、これを試すことができますが、単純なバニラ集計 + ルックアップに対してどのように積み重なるかはわかりません。
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
これらのクエリのパフォーマンスは、インデックスに完全に依存します。最低でも【町】に1つ必要で、代わりに【町、日付】がベストでしょう。他のテーブルが MeasurementID を使用しているが、MeasurementID を使用して Measurement テーブルにほとんどアクセスしない場合は、クラスター化インデックスを削除し、MeasurementID を非クラスター化 PK にして、Town, Date に (一意ではない) クラスター化インデックスを追加します。MeasurementID を使用する他のテーブルがない場合は、その列を完全に削除します。その場合、理由もなくテーブルを肥大化させる役に立たない合成/人工キーです。
インデックスのこれらの推奨される変更は、集計または APPLY を使用して、ここでの回答のすべてのクエリに役立ちます。ウィンドウ関数への影響についてはわかりませんが、オプティマイザが実行計画をどのように解決するかによって異なります (最大日付にアクセスするだけで他のすべての行には触れないことを認識するのに十分賢い場合、同じインデックスがそれを後押しします)信じられないほどですが、オプティマイザがこれを実行できるとは思えません)。
また、パフォーマンスを向上させるために、町全体を配置する代わりに、TownID を使用して、Town テーブルを使用することをお勧めします。町の名前が変わったら?各名前の平均 15 バイト程度から int TownID のわずか 4 バイトに切り替えると、速度が向上します。(テストはこれを確実に証明するためのものですが)。