У меня есть запрос, который в настоящее время использует коррелированный подзапрос для возврата результатов, но я думаю, что проблему можно решить более красноречиво, возможно, с помощью ROW_NUMBER ().
Проблема заключается в профиле значения v в течение нескольких лет для элемента. Каждый элемент имеет несколько версий, каждая из которых имеет свой собственный профиль, который запускается при представлении версии, и в настоящее время данные выглядят так:
ItemId ItemVersionId Year Value
===========================================
1 1 01 0.1
1 1 02 0.1
1 1 03 0.2
1 1 04 0.2
1 1 05 0.2
1 1 06 0.3
1 1 07 0.3
1 1 08 0.4
1 2 04 0.3
1 2 05 0.3
1 2 06 0.3
1 2 07 0.4
1 2 08 0.5
1 3 07 0.6
1 3 08 0.7
2 1 01 0.1
2 1 01 0.1
2 1 01 0.2
etc
Я хочу вернуть полный профиль для элемента, используя самую последнюю версию, где это применимо. Для приведенного выше примера для элемента 1:
ItemId ItemVersionId Year Value
===========================================
1 1 01 0.1
1 1 02 0.1
1 1 03 0.2
1 2 04 0.3
1 2 05 0.3
1 2 06 0.3
1 3 07 0.6
1 3 08 0.7
Я сейчас использую
SELECT ItemId, ItemVersionId, Year, Value
FROM table t
WHERE
ItemId = 1
AND ItemVersionId = (SELECT MAX(ItemVersionId) FROM table WHERE ItemId = t.ItemId AND Year = t.Year)
Хотя это возвращает правильное значение, я подозреваю, что есть более эффективный способ сделать это, особенно когда таблица становится большой.
Я использую SQL Server 2005.
Заранее спасибо