Domanda

Ho una tabella di utenti contenenti le seguenti colonne:

| User_ID  (int) | Name (varchar) |   Age (int)  |  Experience_Level (int) |

vorrei creare una query SQL per l'output tutti gli ID di persone che non sono unici nella combinazione di età e l'esperienza.

Il mio codice finora:

SELECT Count(*), User_ID FROM Users 
GROUP BY Age,Experience_Level
HAVING Count(*) > 1

Ovviamente questa è incompleta, questo gruppo gli utenti non univoci ma non mi tutte le loro User_IDs dirà.

Grazie in anticipo per il vostro aiuto!

È stato utile?

Soluzione

Ecco una query logica negata:

SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)

Altri suggerimenti

Dal momento che si desidera informazioni sui gruppi di più utenti, come si desidera che questi dati restituiti? In una stringa contenente elenco separato da virgole di valori user_id?

Non hai tag tua domanda con il marchio di database SQL si utilizza.

Se si utilizza MySQL o SQLite, è possibile utilizzare la funzione built-in GROUP_CONCAT():

SELECT Count(*), GROUP_CONCAT(User_ID) AS User_List FROM Users 
GROUP BY Age,Experience_Level
HAVING Count(*) > 1

Per impostazione predefinita, GROUP_CONCAT() separa i valori con virgole. Fare riferimento al manuale se lo vuoi formattato in un altro modo.

Ci sono altre soluzioni per altri fornitori di SQL. Questa domanda ha messo a punto molte volte su 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 di 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)

In teoria, ciò che si vuole è qualcosa di simile, ma purtroppo SQL Server non lo consente:

SELECT * FROM Users 
WHERE (Age, Experience_Level) IN
(
    SELECT Age, Experience_Level
    FROM Users  
    GROUP BY Age,Experience_Level 
    HAVING Count(*) > 1 
)

Così, invece, si deve accontentare di unirsi ad una sottoquery:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top