2017-07-22 1 views
0

J'ai obtenu résultat sous-requête SQL comme suitComment comparer les valeurs de ligne dans le résultat de la requête SQL?

A B C 
1 2 12 
1 4 10 
1 3 11 
2 5 9 
2 3 8 
4 7 8 
4 9 3 

Maintenant, je dois les valeurs de sortie de telle manière pour chaque valeur distincte dans la colonne A et et, je dois revenir pour la valeur la plus élevée dans la colonne B la valeur correspondante dans la colonne C

la sortie sera

A B C 
1 4 10 
2 5 9 
4 9 3 

Comment puis-je arriver.

+1

Quel SGBD utilisez-vous? –

+0

@P ரதீப் J'utilise MySQL –

+0

@dsfasdfadf Google: Top 1 par groupe dans 'Mysql' –

Répondre

1

Vous pouvez utiliser la fonction de norme ANSI row_number():

select a, b, c 
from (select t.*, 
      row_number() over (partition by a order by b desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

La fonction row_number() attribue une valeur séquentielle à chaque rangée. Dans ce cas, toutes les lignes ayant la même valeur a reçoivent la même valeur, avec "1" pour la plus grande valeur b. Vous voulez le premier, d'où le seqnum = 1.

MySQL ne supporte pas cette fonction. Au lieu de cela, juste faire:

select t.* 
from t 
where t.b = (select max(t2.b) from t t2 where t2.a = t.a); 

Si vous vous souciez de la performance, vous voulez un index sur t(a, b).

+0

Pourriez-vous s'il vous plaît ajouter quelques explications pour la requête que vous avez écrite. Merci d'avance –

+0

@dsfasdfadf. . . Y a-t-il une raison pour laquelle vous n'avez pas accepté la réponse? –

+0

Je voulais supprimer la question car cette question est en double de cette question: Sélectionnez la première ligne dans chaque groupe GROUP BY? comme indiqué par d'autres utilisateurs déjà. Ce que je pensais être si je n'acceptais pas la réponse StackOverflow me permettrait de supprimer mais ce ne serait pas car il y a une réponse à ma question. Merci pour votre aide. Votre solution accepte parfaitement bien. –