Каков наилучший способ сделать это в SQL (Sybase SQL, если различия имеют значение):
Таблица: (с некоторыми данными выборки)
| id | value1 | value2 | version |
==================================
| 1 | A11 | B11 | 1 |
| 1 | A12 | B12 | 2 |
| 2 | A21 | B21 | 1 |
| 3 | A32 | B32 | 2 |
Unique key: (id, version). Index: (id, version)
Размер набора данных: ~ 100 тыс. Строк в таблице, с предложением типичного запроса where, ограничивающим результаты 10-100 идентификаторами и номерами версий, равными 1,2 или иногда 3.
Что мне нужно сделать: для каждого идентификатора, получить строку с самой высокой версией для этого идентификатора
| id | value1 | value2 | version |
==================================
| 1 | A12 | B12 | 2 | <---- Chosen since 2>1 for id=1
| 2 | A21 | B21 | 1 |
| 3 | A32 | B32 | 2 |
Простое решение: Очевидный способ, которым я могу придумать, - это использовать подзапрос:
SELECT id, value1, value2
FROM T 'T1'
WHERE id in (1, 2, 3, ... 10) -- Obviously a fake sample clause
AND version = (SELECT MAX(version) FROM T 'T2'
WHERE T1.id=T2.id
AND id in (1, 2, 3, ... 10)
)
Вопрос: Это лучший подход?
«Лучший» здесь означает:
«лучший результат в среднем» (с учетом размера набора данных, типичного размера запроса и индексов, показанных выше).
Для подходов с аналогичной производительностью наиболее элегантный код. Это очевидно для наблюдателя, но если вы можете показать, что код является более расширяемым / обслуживаемым, это явный признак элегантного кода.