2
votes

Valeur maximale SQL pour une limite spécifiée

J'essaie de renvoyer une liste d'années lorsque certaines conditions sont remplies mais j'ai des problèmes avec la fonction MAX et je la fais fonctionner avec le reste de ma logique.

Pour les deux tableaux suivants: p >

SELECT y.year
FROM (SELECT c.year, MAX(c.wins), c.team
      FROM coach AS c
      WHERE c.year >= 1999
      GROUP BY c.year, c.team) AS y, teams AS t
WHERE y.year = t.year AND t.worldcupwin = 'Y' AND y.team = t.team;

Je veux obtenir le résultat suivant:

years
-----
2000

Où les années imprimées sont celles où l'équipe des entraîneurs avec le plus de victoires pendant cette période a également remporté la coupe du monde.

J'ai décidé d'utiliser la fonction MAX mais je me suis rapidement heurté au problème de ne pas savoir comment l'utiliser pour ne rechercher que des valeurs maximales pour une année donnée. Voici ce que j'ai jusqu'à présent:

          coach
coach | team | wins | year
------+------+------+------
nk01  | a    | 4    | 2000
vx92  | b    | 1    | 2000
nk01  | b    | 5    | 2003
vx92  | a    | 2    | 2003

           team
team | worldcupwin | year
-----+-------------+------
a    | Y           | 2000
b    | N           | 2000
a    | Y           | 2003
b    | N           | 2003

Cette requête affiche toutes les années supérieures à 1999 pour moi, plutôt que celles où un entraîneur avec le plus de victoires a également remporté le Coupe du monde. (Utilisation de postgresql)

Toute aide est appréciée!


0 commentaires

4 Réponses :


0
votes

utilisez la fonction de fenêtre row_number ()

select a.coach,a.team,a.win,a.year from 

 (select c.*,t.*,
row_number()over(order by wins desc) rn 
from  coach c join team t on c.team=t.team
 where worldcupwin='Y'
 ) a where a.rn=1


0 commentaires

1
votes

Vous pouvez utiliser la sous-requête corrélée

DEMO strong>

year    team
2000    a 

et t.worldcupwin = 'Y'

SORTIE:

   SELECT c.year, c.team
      FROM coachs AS c inner join teams t on c.team = t.team and c.year=t.year
      WHERE c.year >= 1999 and exists (select 1 from coachs c1 where c.team=c1.team 
      having max(c1.wins)=c.wins) 


8 commentaires

Que fait l'existant ici? Je resserre certaines réponses, mais elles ne sont pas toutes correctes.


il vérifiera si l'équipe a gagné maximum ou non @Wintress


Je vois. Cette condition vérifie-t-elle si c'est la victoire maximale pour cette année spécifique? Ou en général?


en avez-vous besoin chaque année ou en général @Wintress


Ok, cela fonctionne partiellement mais ignore la dernière partie t.worldcupwin = 'Y', puisque je sélectionne dans c.year, & c.team. Ainsi, même lorsque t.worldcupwin est N, il restera un an. J'en ai aussi besoin chaque année! FA


quel est votre résultat attendu @Wintress, car je peux voir que worldcupwin = 'Y' pour l'équipe b également - pourriez-vous s'il vous plaît clarifier votre question un peu plus


continuons cette discussion dans le chat .


La production attendue n'est que de 2000 car l'équipe a a remporté le plus de victoires et a également remporté la coupe du monde. 2003 n'est pas incluse car même si l'équipe b a remporté la coupe du monde, elle n'a pas obtenu le plus grand nombre de victoires pour cette déchirure.



1
votes

La requête suivante utilise DISTINCT ON :

year    team
-------------
2000    a

afin de renvoyer les enregistrements ayant le plus grand nombre de victoires par an

SELECT year, team
FROM (
   SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
   FROM coach AS c
   INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
   WHERE c.year > 1999 
   ORDER BY year, wins DESC) AS t
WHERE t.worldcupwin = 'Y'       
ORDER BY year, wins DESC

Filtrage des équipes n'ayant pas remporté la coupe du monde:

year    wins    worldcupwin team
---------------------------------
2000    4       Y           a
2003    5       N           b

donne le résultat attendu:

SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
FROM coach AS c
INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
WHERE c.year > 1999 
ORDER BY year, wins DESC


0 commentaires

1
votes

Vous pouvez utiliser ce qui suit pour obtenir le résultat souhaité:

MÉTHODE FACILE

SELECT TOP 1 c.year 

FROM coach AS c INNER JOIN team AS t ON c.team = t.team AND c.year = t.year

WHERE t.worldcupwin = 'Y'

ORDER BY c.wins DESC;


0 commentaires