75 votes

Sql serveur sélectionner la première ligne d'un groupe

Je possède une table comme celle-ci:

a          b
1          23
1          2
1          7
2          9
2          11

Je veux sélectionner la première ligne (l'ordre n'a pas d'importance) d'une requête "GROUP BY a", le résultat devrait être

a          b
1          23
2          9

Je suis en train d'utiliser SQL SERVER 2008, comment écrire la requête pour cela?

1 votes

Ainsi, (1,2),(2,11) serait également acceptable car l'ordre n'a pas d'importance? (Ou tout autre valeur arbitraire de b par rapport à a)

0 votes

Oui, j'ai juste besoin d'une rangée, peu importe ce qu'elle est

0 votes

Est-ce que cela répond à votre question ? Sélectionner la première ligne de chaque groupe GROUP BY ?

141voto

remi bourgarel Points 3893
sélectionnez a,b
de (
sélectionnez a,b, rang() à travers(partition par a ordre par b desc) comme ordre_de_ligne
de maTable
) temp
où ordre_de_ligne = 1

voir http://msdn.microsoft.com/en-us/library/ms186734.aspx

6 votes

Lorsqu'il n'y a qu'une seule autre valeur à extraire de la ligne de chaque groupe (comme ici), il est plus simple d'utiliser simplement MIN ou MAX (votre exemple est équivalent à simplement sélectionner MAX(b)). Bien sûr, pour plus de colonnes, cela a plus de sens.

0 votes

Bien que la requête semble complexe, elle offre la flexibilité de sélectionner plusieurs colonnes.

0 votes

Même si votre colonne n'est pas numérique, MAX/MIN fonctionnera ;-)

79voto

Lieven Keersmaekers Points 32396

Si comme vous l'avez indiqué, l'ordre n'a pas d'importance, n'importe quelle fonction d'agrégation sur b serait suffisante.

Exemple utilisant MIN

SELECT a, b = MIN(b)
FROM   VotreTable
GROUP BY
       a

0 votes

Merci Lieven, mais cela ne sélectionne qu'une seule valeur particulière. Que faire s'il y avait plus de colonnes et que nous devions sélectionner toute la LIGNE (comme le titre le dit) ?

1 votes

@dpelisek - Une solution typique consisterait à ajouter un numéro de ligne à chaque ligne partitionnée par la ou les colonnes que vous souhaitez regrouper, et à ne sélectionner que celles où le numéro de ligne est égal à 1. J'ai mis en place un SQL Fiddle pour montrer l'intention. Edit , Je devrais vraiment lire les autres réponses d'abord. Remi a posté quelque chose de similaire.

3 votes

C'est faux. La solution trouve le MIN et non le PREMIER. Le commentaire ci-dessus est beaucoup mieux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X