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!

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top