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!
4 Réponses :
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
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!
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
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.
quelle sera la sortie pour shopId = 2 en utilisant votre requête
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;
Veuillez fournir la requête que vous avez essayée
Serveur de base de données de balises
Consultez les réponses ici