Groupe SQL par - Sélectionner les deux colonnes
Question
J'ai une table d'utilisateurs contenant les colonnes suivantes:
| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) |
Je voudrais créer une requête SQL pour produire tous les ID des personnes qui ne sont pas uniques dans la combinaison de l'âge et de l'expérience.
Mon code à ce jour:
SELECT Count(*), User_ID FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
Il est évident que ceci est incomplet, ce groupera les utilisateurs non uniques, mais il ne me dira pas tous leurs User_IDs.
Merci d'avance pour votre aide!
La solution
Voici une requête logique niée:
SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)
Autres conseils
Puisque vous voulez des informations sur les groupes de plusieurs utilisateurs, comment voulez-vous ces données est revenu? Dans une chaîne contenant la liste séparée par des virgules des valeurs user_id?
Vous ne l'étiquette votre question avec la marque de base de données SQL que vous utilisez.
Si vous utilisez MySQL ou SQLite, vous pouvez utiliser la fonction GROUP_CONCAT()
intégrée:
SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
Par défaut, GROUP_CONCAT()
sépare les valeurs par des virgules. Reportez-vous au manuel si vous voulez formater une autre façon.
Il existe d'autres solutions pour d'autres fournisseurs SQL. Cette question a été soulevée à plusieurs reprises sur Stack Overflow:
SELECT t.User_ID, t.Age, t.Experience_Level
FROM Users t INNER JOIN
(SELECT Age, Experience_Level
FROM Users
GROUP BY Age, Experience_Level
HAVING Count(*) > 1) d ON t.Age = d.Age AND t.Experience_Level = d.Experience_Level
script de test:
create table Users (
User_ID int,
Name varchar(50),
Age int,
Experience_Level int
)
insert into Users (User_ID, Name, Age, Experience_Level) values (1, 'A', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (2, 'B', 37, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (3, 'C', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (4, 'D', 35, 2)
insert into Users (User_ID, Name, Age, Experience_Level) values (5, 'E', 33, 1)
insert into Users (User_ID, Name, Age, Experience_Level) values (6, 'F', 35, 2)
insert into Users (User_ID, Name, Age, Experience_Level) values (7, 'G', 18, 1)
En théorie, ce que vous voulez est quelque chose comme ça, mais malheureusement SQL Server ne permet pas:
SELECT * FROM Users
WHERE (Age, Experience_Level) IN
(
SELECT Age, Experience_Level
FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
)
Ainsi, au lieu, vous devez se contenter de se joindre à une sous-requête:
SELECT Users.* FROM Users
INNER JOIN
(
SELECT Age, Experience_Level
FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
) subq
ON Users.Age = subq.Age
AND Users.Experience_Level = subq.Experience_Level