1
votes

afficher les colonnes supplémentaires où le groupe a un nombre de 1

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?


3 commentaires

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


5 Réponses :


2
votes

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


0 commentaires

0
votes

Vous pouvez également faire

Select * from Students where lastname in (Select lastname from Students group by lastname having count(*) =1)


0 commentaires

0
votes

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.


0 commentaires

0
votes

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


0 commentaires

0
votes

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)


0 commentaires