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!

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top