7
votes

Remettre la ligne de retour avec la valeur max d'une colonne par groupe

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 à: xxx

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. xxx

maintenant j'ai: xxx

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.)

Que puis-je faire obtenir les bonnes valeurs?


0 commentaires

3 Réponses :


5
votes

Vous êtes sur la bonne voie en utilisant des fonctions analytiques. Mais vous voulez probablement quelque chose comme celui-ci avec la fonction class xxx

s'il peut y avoir des liens (lignes ayant le même ID et < Code> rond ) Vous pouvez utiliser la fonction d'analyse row_number au lieu de class - qui choisira arbitrairement une des deux lignes liées à avoir un < Code> RNK de 1 plutôt que de retourner à la fois comme classement serait.

Si vous souhaitez utiliser la fonction analytique max , vous pouvez également faire quelque chose comme xxx


0 commentaires

7
votes

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;


0 commentaires

0
votes

Pour ce type de problèmes, j'ai tendance à utiliser le max ... dense_rank construction: xxx

sql violon


0 commentaires