Por SQL Grupo - Seleccione las dos columnas
Pregunta
Tengo una tabla de usuarios que contienen las siguientes columnas:
| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) |
Me gustaría crear una consulta SQL para dar salida a todos los ID de gente que no es único en la combinación de la edad y la experiencia.
Mi código hasta ahora:
SELECT Count(*), User_ID FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
Obviamente, esto es incompleta, este grupo los usuarios no únicos, pero no me la totalidad de sus User_IDs lo dirá.
Gracias de antemano por su ayuda!
Solución
Aquí está una consulta lógica negada:
SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)
Otros consejos
Desde desea información acerca de los grupos de usuarios múltiples, ¿cómo quiere estos datos devuelto? En una cadena que contiene la lista separada por comas de valores user_id?
no etiquetar a su pregunta con la marca de base de datos SQL que utilice.
Si utiliza MySQL o SQLite, se puede utilizar la función integrada de GROUP_CONCAT()
:
SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
Por defecto, GROUP_CONCAT()
separa los valores con comas. Consulte el manual si desea que el formato de otra manera.
Hay otras soluciones para otros proveedores de SQL. Esta cuestión se ha planteado muchas veces en desbordamiento de pila:
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 prueba:
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 teoría, lo que quiere es algo como esto, pero lamentablemente SQL Server no lo permite:
SELECT * FROM Users
WHERE (Age, Experience_Level) IN
(
SELECT Age, Experience_Level
FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
)
Así que en lugar, usted tiene que conformarse con unirse a una sub consulta:
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