我有一张这样的桌子:
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)
但是,只有第一行显示结果中的第二个最高值,其他行仍显示最高的计数:
shopID supply_count
1 10
2 12
3 5
4 15
我的预期结果是找到每个商店的第二高供应量,如下所示:
shopID supply_count
1 10
2 12
3 2
4 11
那么,有人有什么建议吗?谢谢!
答案 0 :(得分:0)
使用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
答案 1 :(得分:0)
如果您的dbms支持,请使用row_number
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
答案 2 :(得分:0)
您的解决方案非常有趣。您只需要像这样完成
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
这在当今大多数数据库系统上都应该有效(与窗口函数相比)。但是,如果您要阅读表的很大一部分,则窗口函数往往是一种更有效的解决方案。
答案 3 :(得分:0)
在某些情况下,仅排序和限制结果可能会有用:
SELECT suply_count FROM shop
ORDER BY suply_count DESC limit 1,1;