2016-05-10 3 views
1

Предположим у меня есть следующая таблица так:SQL Server: возвращает максимальное из группы

Parent_Company Child_Company Requested Authorized Char1 Char2 
------------------------------------------------------------------------ 
Fruits    Apples   $1000  $1000   A  10 
Fruits    Apples   $10000  $5000   E  10 
Fruits    Apples   $7000  $7000   C  15 
Fruits    Pears   $1000  $0   B  20 
Fruits    Grapes   $1000  $200   A  10 
Vegetables   Celery   $500  $500   D  17 
Vegetables   Celery   $1000  $1000   A  10 
Vegetables   Lettuce  $1000  $1000   A  10 
Vegetables   Lettuce  $2000  $0   B  12 

Я хочу, чтобы мой запрос, чтобы вернуться:

Parent_Company Child_Company Requested Authorized Char1 Char2 
------------------------------------------------------------------------ 
Fruits    Apples   $7000  $7000   C  15 
Fruits    Pears   $1000  $0   B  20 
Fruits    Grapes   $1000  $200   A  10 
Vegetables   Celery   $1000  $1000   A  10 
Vegetables   Lettuce  $1000  $1000   A  10 

Логика здесь в том, что на основе разные Родительские/Детские комбинации, я хочу, чтобы он возвращал строку с наивысшей суммой Authorized.

Первая мысль, которая пришла в голову, что я могу просто использовать Max + Group По запросу:

SELECT 
     Parent_company, Child_Company, Char1, Char2, Requested, 
     Max(Authorized) 
    FROM 
     Food 
    GROUP BY 
     Parent_Company, Child_Company, Char1, Char2, Requested 

Но это на самом деле не работает так, как я хочу, так как char1, char2 и Запрашиваемые суммы меняются ,

Из моего ограниченного знания SQL Server я считаю, что возможно что-то с PARTITION BY можно использовать, но я действительно не знаю, как подойти к нему с этим.

Справка была бы принята с благодарностью.

ответ

2

Вы на правильном пути с перегородкой. Вы можете использовать функцию row_number и раздел [Parent_Company], [Child_Company] для номера данных, а затем отфильтровать верхние строки:

select * from (
select *, row_number() over (partition by [Parent_Company], [Child_Company] 
           order by [Authorized] desc) as row_number 
from your_table 
) as table_alias 
where row_number = 1 
Смежные вопросы