Requête SQL pour revenir à seulement 1 enregistrement par l'ID de groupe
Je suis à la recherche d'un moyen de gérer le scénario suivant. J'ai une table de base de données que j'ai besoin de retourner un seul enregistrement pour chaque "group id" qui est contenue dans la table, en outre, l'enregistrement est sélectionné à l'intérieur de chaque groupe doit être la personne la plus âgée du ménage.
ID Group ID Name Age
1 134 John Bowers 37
2 134 Kerri Bowers 33
3 135 John Bowers 44
4 135 Shannon Bowers 42
Ainsi, dans l'échantillon de données ci-dessus j'aurais besoin de l'ID 1 et 3 est retournée, comme ils sont les plus anciens les gens à l'intérieur de chaque groupe id.
C'est interrogée sur un Serveur SQL server 2005 bases de données.
Si vous souhaitez que le nom, vous avez encore la chance de choix >1 ligne si vous avez >1 personne avec les plus âgés. Vous devrez également établir des critères de choisir un nom en tant que bien dans ce cas.
Bon point de Chris. Est a été d'essayer de simplifiy la question, un peu, mais qui laisse des trous comme celles-ci 🙂 en fait, j'ai un autre champ pour le sexe, donc je suis à la recherche pour sélectionner le mâle le plus âgé au sein d'un ménage. s'il est de sexe masculin, puis la femelle la plus âgée. Dans le cas où il y a deux hommes dans le même ménage avec le même âge alors j'ai besoin de sélectionner seulement 1 des enregistrements. Cela pourrait être basied sur quelque chose d'aussi simple que la personne avec le plus petit numéro d'identification pour les départager.
Il y a une bonne discussion de ce genre de problème dans l'article 21.4, "Extrema des Fonctions", de Joe Celko de l'excellent livre "SQL pour les Smarties". Si vous allez être en cours d'exécution dans quelque chose de plus compliqué que la simple Sélectionne et INSERTs, je recommande fortement ce livre.
Bon point de Chris. Est a été d'essayer de simplifiy la question, un peu, mais qui laisse des trous comme celles-ci 🙂 en fait, j'ai un autre champ pour le sexe, donc je suis à la recherche pour sélectionner le mâle le plus âgé au sein d'un ménage. s'il est de sexe masculin, puis la femelle la plus âgée. Dans le cas où il y a deux hommes dans le même ménage avec le même âge alors j'ai besoin de sélectionner seulement 1 des enregistrements. Cela pourrait être basied sur quelque chose d'aussi simple que la personne avec le plus petit numéro d'identification pour les départager.
Il y a une bonne discussion de ce genre de problème dans l'article 21.4, "Extrema des Fonctions", de Joe Celko de l'excellent livre "SQL pour les Smarties". Si vous allez être en cours d'exécution dans quelque chose de plus compliqué que la simple Sélectionne et INSERTs, je recommande fortement ce livre.
OriginalL'auteur Richard West | 2009-12-23
Vous devez vous connecter pour publier un commentaire.
ou ceci:
Ce sera de retour au plus un enregistrement par groupe, même en cas de liens.
Voir cet article dans mon blog pour la comparaison des performances de deux méthodes:
Grâce Quassnoi. J'ai été en mesure d'ajouter la colonne de genre en plus de l'âge de la colonne dans votre clause ORDER By et obtenir les résultats que je cherchais! (La colonne de genre a été discutée dans un commentaire après ma question de départ) Votre solution est parfait, et adaptable!
Question de suivi. Ces va être exécuté contre 175 millions de disques. Est l'un ou l'autre de requête plus efficace?
@Richard West
: combien de groupes distincts avez-vous? Avez-vous une autre table qui contient les groupes?Pour une raison quelconque SQL Server me donne
Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'WHERE'
.OriginalL'auteur Quassnoi
Utilisation:
Alors que faire si il y a+ de 2 personnes ayant le même âge pour un groupe? Il serait préférable de stocker la date de naissance plutôt que l'âge, vous pouvez toujours calculer la date de naissance pour la présentation.
OriginalL'auteur OMG Ponies
Essayer ceci (en supposant Groupe est synonyme de Ménage)
Si il y a deux ou plus de plus "ancien" des gens dans certains ménages (Ils sont tous le même âge et il n'y a personne d'autre n'âgées), puis ce sera le retour de tous, et pas seulement une au hasard.
Si c'est un problème, alors vous avez besoin d'ajouter une autre sous-requête pour renvoyer un arbitraire de la valeur de la clé pour une personne de cet ensemble.
OriginalL'auteur Charles Bretana
OriginalL'auteur Chris Simmons