Если столбец даты никогда не равен NULL, я рекомендую RANK (), если вы используете хотя бы SQL Server 2005. Управлять им гораздо проще, если вы когда-либо вносите изменения, потому что вам не нужно ничего менять в подзапросе и в основном запросе.
Для SQL Server 2005 и более поздних версий:
WITH myRecordsRanked(A,B,C,D,E,F,rk) AS (
SELECT A,B,C,D,E,F,
RANK() OVER (
PARTITION BY B
ORDER BY C DESC
)
FROM myRecords
)
SELECT A,B,C,D,E,F
FROM myRecordsRanked
WHERE rk = 1;
Выбор значений rk = 1 даст вам связи. Используйте столбец ORDER BY разрыва связи, если вам нужна конкретная одна из связанных строк, или используйте ROW_NUMBER, если вам не нужен последовательный выбор между связями, и вы обнаружите, что стоит избегать дополнительной сортировки.
Для SQL Server 2000:
SELECT A,B,C,D,E,F
FROM myRecords
WHERE NOT EXISTS (
SELECT * FROM myRecords as R2
WHERE R2.B = myRecords.B
AND R2.C > myRecords.C
)
(Это также даст вам связи на последнюю дату для значения столбца B.)