Supposons que j'ai une table Etudiants
avec seulement 2 colonnes LastName
et FirstName
. Je sais que je peux obtenir tous les LastName
qui n'ont qu'un seul FirstName
avec:
select LastName from Students group by LastName having count(*) = 1
Mais que faire si je veux aussi afficher le prénom de ces lignes?
5 Réponses :
Vous pouvez filtrer avec une sous-requête corrélée:
select * from (select s.*, count(*) over(partition by LastName) cnt from students s) t where cnt = 1
Ou, si vous avez une colonne principale, vous pouvez utiliser n'existe pas
:
select s.* from student s where not exists ( select 1 from students s1 where s1.LastName = s.LastName and s1.id <> s.id )
Cette requête tirerait parti d'un index sur (id, LastName)
.
Enfin, une autre option courante consiste à effectuer un décompte de fenêtres:
select s.* from students s where (select count(*) from students s1 where s1.LastName = s.LastName) = 1
Vous pouvez également faire
Select * from Students where lastname in (Select lastname from Students group by lastname having count(*) =1)
Ajoutez-le simplement au select
:
select s.LastName, min(s.firstname) from Students s group by s.LastName having count(*) = 1;
Si une seule ligne correspond, alors min ()
renvoie la valeur ligne.
Vous devez l'obtenir en utilisant n'importe quelle fonction d'agrégation qui peut renvoyer la valeur souhaitée. Min, Max, first_value (), ir string_agg () vous pouvez vouloir tous les noms avec le nom dans un autre cas d'utilisation
select LastName, first_value(firstname) over (order by firstname) firstname, Min(firstname) from Students group by LastName having count(*) = 1
J'en ai trouvé un autre moi-même:
with LastNames as ( select LastName from Students group by LastName having count(*) = 1 ) select LastName, FirstName from Students where LastName in (select LastName from LastNames)
Avez-vous essayé d'inclure simplement le prénom dans votre instruction de sélection comme ceci: sélectionnez Nom, Prénom du groupe d'étudiants par Nom ayant count (*) = 1
@LemuelBotha, vous ne pouvez pas inclure une colonne qui n'est pas une fonction d'agrégation ou pas dans le groupe par colonnes
Oh oui tu as raison