مجموعة SQL بواسطة - حدد كلا العمدين
سؤال
لدي جدول من المستخدمين الذي يحتوي على الأعمدة التالية:
| User_ID (int) | Name (varchar) | Age (int) | Experience_Level (int) |
أرغب في إنشاء استعلام SQL لإخراج جميع معرفات الأشخاص الذين ليسوا فريدين في مزيج من العمر والخبرة.
رمز بلدي حتى الآن:
SELECT Count(*), User_ID FROM Users
GROUP BY Age,Experience_Level
HAVING Count(*) > 1
من الواضح أن هذا غير مكتمل ، سيؤدي ذلك إلى تجميع المستخدمين من غير Unique ، لكنه لن يخبرني جميع المستخدمين.
شكرا مقدما لمساعدتكم!
المحلول
إليك استعلام منطقي نفي:
SELECT *
FROM Users
WHERE UserID not in
(
SELECT MIN(UserID)
FROM Users
GROUP BY Age, Experience_Level
HAVING COUNT(*) = 1
)
نصائح أخرى
نظرًا لأنك تريد معلومات حول مجموعات من المستخدمين المتعددين ، كيف تريد إرجاع هذه البيانات؟ في سلسلة تحتوي على قائمة مفصولة بفاصلة من قيم 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 الآخرين. ظهر هذا السؤال عدة مرات على سعة مكدس:
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)
من الناحية النظرية ، ما تريده هو شيء من هذا القبيل ، ولكن لسوء الحظ لا يسمح SQL Server بذلك:
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