Начиная с SQL Server 2005, просто используйте ROW_NUMBER()
:
SELECT ID, Name, OrderDate, OrderValue
FROM (
SELECT
o.*,
ROW_NUMBER() OVER(PARTITION BY Name, OrderDate ORDER BY OrderValue DESC) rn
FROM orders o
) x WHERE rn = 1
ROW_NUMBER()
присваивает ранг каждой записи в группах записей с одинаковыми Name
и OrderDate
, отсортированными по OrderValue
.Запись с наивысшим значением порядка получает номер строки 1.
В более старых версиях решение для фильтрации таблицы заключается в использовании коррелированного подзапроса с условием NOT EXITS
:
SELECT ID, Name, OrderDate, OrderValue
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM orders o1
WHERE
o1.Name = o.Name
AND o1.OrderDate = o.OrderDate
AND o1.OrderValue > o.OrderValue
)
Условие NOT EXISTS
обеспечивает отсутствие других записей с наибольшим значением OrderValue
для тех же Name
и OrderDate
.