Вы можете попробовать что-то вроде этого в SQL Server:
Таблица
create table ex1 (
id int,
item char(1),
price int,
qty int,
usr char(2)
);
Данные
insert into ex1 values
(1, 'a', 7, 1, 'ab'),
(1, 'a', 7, 2, 'ac'),
(2, 'b', 6, 1, 'ab'),
(2, 'b', 6, 1, 'av'),
(2, 'b', 5, 1, 'ab'),
(3, 'c', 5, 2, 'ab'),
(4, 'd', 4, 2, 'ac'),
(4, 'd', 3, 1, 'av');
Запрос
select a.* from ex1 a
join (
select id, max(price) as maxprice, min(usr) as minuser
from ex1
group by id
) c
on c.id = a.id
and a.price = c.maxprice
and a.usr = c.minuser
order by a.id, a.usr;
Результат
id item price qty usr
1 a 7 1 ab
2 b 6 1 ab
3 c 5 2 ab
4 d 4 2 ac
Пояснение
В вашем наборе данных ID 1 имеет 2 записи с одинаковой ценой. Вы должны принять решение, какой вы хотите. Итак, в приведенном выше примере я показываю одну запись для пользователя, чье имя в алфавитном порядке наименьшее.
Альтернативный метод
SQL Server имеет функцию ранжирования row_number over()
, которая также может использоваться:
select * from (
select row_number() over( partition by id order by id, price desc, usr) as sr, *
from ex1
) c where sr = 1;
В подзапросе говорится - дайте мне все записи из таблицы и дайте каждой строке серийный номер, начиная с 1 уникального для каждого идентификатора. Сначала нужно отсортировать строки по идентификатору, затем по убыванию цены и затем по usr. Внешний запрос выбирает записи с номером sr 1.
Пример здесь: https://rextester.com/KZCZ25396