Использование двух агрегатных функций - min и max для одного запроса - PullRequest
0 голосов
/ 05 марта 2019

Вот данные моей таблицы продуктов -

product_id  category    discount
454           C-10       10 
357           C-10       9
64            C-10       10
294           C-11       17 
449           C-11       17
471           C-11       17 
89            C-11       12 
56            C-11       10

Я хочу получить максимальную скидку для каждой категории продуктов, и если в любой категории есть несколько продуктов с одинаковой скидкой, следует выбрать продукт с минимальным идентификатором product_id..

Желаемый вывод -

product_id  category    discount
64          C-10        10
294         C-11        17

Я пробовал ниже два запроса, но не работал -

select category,min(product_id),max(discount)
from Product 
group by category

Ваша помощь очень ценится.Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

использовать row_number()

select * from
(
select *,row_number() over(partition by category order by discount desc, poroduct_id asc) rn
from tablename
)A where rn=1

ИЛИ использовать коррелированный подзапрос

select * from tablename a where discount in 
  (select max(discount) from tablename b where a.category=b.category 
     having min(b.product_id)=a.product_id)
0 голосов
/ 05 марта 2019

использование внешнего применения

with cte as    
(
select 454 as product_id, 'C-10'  as category, 10 as discount union all
select 357,'C-10',9 union all
select 64,'C-10',10 union all
select 294,'C-11',17 union all
select 449,'C-11',17 union all
select 471,'C-11',17 union all
select 89,'C-11', 12 union all
select 56,'C-11', 10 

) select distinct p1.category,a.product_id,a.discount
 from cte p1
 outer apply ( select top 1 p2.*
               from cte p2 where p1.category=p2.category  
                order by discount desc, product_id asc

             ) a 

вывод

category    product_id   discount
C-10        64               10
C-11        294              17

демонстрационная ссылка

0 голосов
/ 05 марта 2019

Использование ROW_NUMBER здесь полезно:

WITH cte AS (
    SELECT product_id, category, discount,
        ROW_NUMBER() OVER (PARTITION BY category
            ORDER BY discount DESC, product_id) rn
    FROM Product
)

SELECT product_id, category, discount
FROM cte
WHERE rn = 1;

Или мы можем даже сделать это без использования подзапроса / CTE:

SELECT TOP 1 WITH TIES product_id, category, discount
FROM Product
ORDER BY
    ROW_NUMBER() OVER (PARTITION BY category
        ORDER BY discount DESC, product_id);
...