用于查找匹配子集的SQL查询

问题描述 投票:-3回答:2

我有一张桌子Students(StudentID, classes, school, advisor),我需要找到一对学生,他们完全采用相同的课程。

例如,在表格中:

enter image description here

我会有一个输出:

S3678和S8978

因为它们都使用相同数量的类(2)和类,法语和逻辑。

mysql sql
2个回答
0
投票
  • 如果在postgre8.4 +中,则使用函数“array_agg”
  • 如果这是在mySql5.6中,则将array_agg()更改为GROUP_CONCAT(类)。
  • 如果问题在Oracle中,则将GROUP_CONCAT()更改为COLLECT。
select t1.studentid
from 
(select studentid, array_agg(classes) as classes_set
from (select studentid, classes from students order by studentid, classes) as st1
group by studentid) t1
join (select studentid, array_agg(classes) as classes_set
from (select studentid, classes from students order by studentid, classes) as st2
group by studentid) t2
on t1.classes_set=t2.classes_set and t1.studentid <> t2.studentid
Result:
studentid
S8978
S3678

0
投票

使用T-SQL(初始答案是在没有使用DB的DBMS的情况下...):

我会用common table expression来解决这个问题:

;WITH cte AS (
    SELECT StudentID, COUNT(Classes) numOfClassesTaken, 
        STUFF((SELECT DISTINCT ', ' + Classes
               FROM Students s2
               WHERE s2.StudentID = s1.StudentID
               ORDER BY ', ' + Classes
               FOR XML PATH('')), 1, 2, '') as ClassList
    FROM Students s1
    GROUP BY StudentID)
, matchingClasses AS (
    SELECT numOfClassesTaken, ClassList
    FROM cte
    GROUP BY numOfClassesTaken, ClassList
    HAVING COUNT(*) > 1)

SELECT t1.StudentID, t1.ClassList 
FROM cte t1
INNER JOIN matchingClasses t2 ON t1.numOfClassesTaken = t2.numOfClassesTaken AND t1.ClassList = t2.ClassList

enter image description here

[DEMO HERE]

© www.soinside.com 2019 - 2024. All rights reserved.