Любой ответ, который присоединяется к таблице сам по себе, создаст закон квадрата ...
- a JOIN b ON a.class = b.class AND a.age >= b.age
- on average the >= condition will be true for half the class
- 6 people in a class
->6*6/2 = 18
- 10 people in a class
->10*10/2 = 50
-> very rapid growth
По мере увеличения размеров таблицы производительность будет быстро ухудшаться. Если вы держите вещи маленькими, и они не будут сильно расти, это проблема? Твой звонок там ...
Альтернатива включает в себя больше кода, но растет линейно ...
- Сначала вставьте все записи в новую таблицу с полем IDENTITY, упорядоченным по классу, а затем по возрасту
- Теперь для каждого класса найдите МИН (id)
- Теперь для каждого класса промыть запись где = MIN (id) + 8 (для 9-го старшего)
Есть много способов сделать последние 2 шага. Я бы лично использовал ...
SELECT
[USER_WITH_IDS].id,
[USER_WITH_IDS].class,
[USER_WITH_IDS].age
FROM
[USER_WITH_IDS]
WHERE
[USER_WITH_IDS].id = (
SELECT
MIN([min].ID) + 8
FROM
[USER_WITH_IDS] AS [min]
WHERE
[min].class = [USER_WITH_IDS].class
)
Что это дает ...
- Один проход для создания новых идентификаторов
- Один проход, чтобы получить МИН (id) для каждого класса
Один проход, чтобы получить нужные записи
И в зависимости от того, насколько хорош оптимизатор, использование индекса (class, id) позволит ему объединить последние 2 прохода в 1 проход.
2 или 3 прохода, независимо от размера стола или размера класса. Линейный, а не квадратный закон ...