Получить 2-й самый высокий счет по каждой группе - PullRequest
1 голос
/ 16 апреля 2019

У меня есть такая таблица:

shopID    supplier    supply_count
1         a           12
1         b           10
1         c           8
1         d           7
2         b           12
2         f           12
2         e           10
3         b           5
3         a           2
4         f           15
4         c           11

Я использовал функцию not in следующим образом:

where supply_count NOT IN (select max(supply_count) from supply)

Однако только первая строка показывает 2-е наибольшее значение в результате, остальные строки по-прежнему показывают наибольшее значение:

shopID   supply_count
1        10
2        12
3        5
4        15

Мой ожидаемый результат - найти второе по величине количество поставок для каждого магазина, как это:

shopID   supply_count
1        10
2        12
3        2
4        11

Так, у кого-нибудь есть предложения? спасибо!

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

используйте row_number, если ваша dbms поддерживает

with cte as
(
select *,row_number() over(partition by shopID order by supply_count desc) rn from table_name
) select * from cte where rn=2
0 голосов
/ 16 апреля 2019

Ваше решение довольно интересное.Вам просто нужно закончить так:

select s1.shopId, max(s1.supply_count)
from supply s1
where supply_count NOT IN (
   select max(supply_count) 
   from supply s2
   where s1.shopId = s2.shopId
)
group by s1.shopId

Это должно работать на большинстве современных систем баз данных (по сравнению с оконными функциями).Однако оконные функции, как правило, являются более эффективным решением, если вы будете читать значительную часть ваших таблиц.

0 голосов
/ 16 апреля 2019

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

select shopid,supply_count
from
(
select shopID,supply_count,row_number() over(partition by shopID order by supply_count) as rn
from tablename
)A where rn=2 
...