2

次の列を含むユーザーのテーブルがあります。

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

年齢と経験の組み合わせで一意ではない人々のすべてのIDを出力するSQLクエリを作成したいと思います。

これまでの私のコード:

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

明らかにこれは不完全です。これにより、一意でないユーザーがグループ化されますが、すべてのUser_IDが通知されるわけではありません。

よろしくお願いします!

4

4 に答える 4

3

否定されたロジッククエリは次のとおりです。

SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)
于 2010-07-02T01:00:53.717 に答える
2

複数のユーザーのグループに関する情報が必要なので、このデータをどのように返しますか?user_id値のコンマ区切りリストを含む文字列で?

使用しているSQLデータベースのブランドで質問にタグを付けていません。

MySQLまたはSQLiteを使用する場合は、組み込みGROUP_CONCAT()関数を使用できます。

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

デフォルトでGROUP_CONCAT()は、値はコンマで区切ります。別の形式でフォーマットする場合は、マニュアルを参照してください。

他のSQLベンダー向けの他のソリューションがあります。この質問は、StackOverflowで何度も出てきます。

于 2010-07-02T00:55:53.250 に答える
1
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

テストスクリプト:

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)
于 2010-07-02T00:57:07.780 に答える
1

理論的には、必要なものは次のようなものですが、残念ながらSQLServerでは許可されていません。

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

したがって、代わりに、サブクエリへの参加を決定する必要があります。

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
于 2010-07-02T01:00:50.810 に答える