1
votes

Récupérer le 2e nombre le plus élevé de chaque groupe

J'ai une table comme celle-ci:

shopID   supply_count
1        10
2        12
3        2
4        11

J'ai utilisé la fonction not in comme ceci:

shopID   supply_count
1        10
2        12
3        5
4        15

Cependant, seulement le premier La ligne affiche la deuxième valeur la plus élevée du résultat, les autres lignes affichant toujours le nombre le plus élevé:

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

Mon résultat attendu est de trouver le deuxième nombre d'approvisionnement le plus élevé pour chaque magasin comme celui-ci :

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

Alors, quelqu'un a des suggestions? merci!


3 commentaires

Veuillez fournir la requête que vous avez essayée


Serveur de base de données de balises


Consultez les réponses ici


4 Réponses :


0
votes

utilisez 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 commentaires

J'ai essayé cette solution et cela fonctionne parfaitement. Mais ici: 'order by supply_count' doit être dans l'ordre décroissant. Quoi qu'il en soit, merci pour votre aide!



0
votes

utilisez row_number si vos dbms prennent en charge

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 commentaires

0
votes

Votre solution est assez intéressante. Il vous suffit de terminer comme ceci

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

Cela devrait fonctionner sur la plupart des systèmes de base de données actuels (par rapport aux fonctions de fenêtre). Cependant, les fonctions de fenêtre ont tendance à être une solution plus efficace si vous lisez une partie importante de vos tableaux.


1 commentaires

quelle sera la sortie pour shopId = 2 en utilisant votre requête



0
votes

dans certains cas, il peut être utile d’ordonner et de limiter le résultat:

SELECT suply_count FROM shop
ORDER BY suply_count DESC limit 1,1;


0 commentaires