J'ai du mal à faire cela sans rechercher la même table au moins deux fois pour saisir la ligne Max, puis saisir la valeur de cette ligne. La table en question est assez grosse, c'est inacceptable.
Voici ce que ma table pourrait ressembler à: p> J'ai besoin de retourner le score que chaque identifiant a été obtenu le tour le plus récent. C'est-à-dire que la ligne avec le max (rond), mais pas le score maximum. P> maintenant j'ai: p> Cela fonctionne, mais est assez inefficace (je dois filtrer manuellement toutes ces lignes, lorsque je devrais juste être capable de ne pas attraper ces lignes en premier lieu.) P> Que puis-je faire obtenir les bonnes valeurs? p> p>
3 Réponses :
Vous êtes sur la bonne voie en utilisant des fonctions analytiques. Mais vous voulez probablement quelque chose comme celui-ci avec la fonction s'il peut y avoir des liens (lignes ayant le même Si vous souhaitez utiliser la fonction analytique code> max max>, vous pouvez également faire quelque chose comme p> class code>
ID code> et < Code> rond code>) Vous pouvez utiliser la fonction d'analyse
row_number code> au lieu de
class code> - qui choisira arbitrairement une des deux lignes liées à avoir un < Code> RNK code> de 1 plutôt que de retourner à la fois comme
classement code> serait. P>
Ceci est également possible sans sous-requête:
SELECT DISTINCT id ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;
Pour ce type de problèmes, j'ai tendance à utiliser le sql violon p> p> max ... dense_rank code> construction: