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!
4 Réponses :
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
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)
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.
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
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;