2014-02-16 4 views
0

Я пытаюсь выяснить, как написать SQL-запрос, чтобы найти отдельные пары идентификаторов студентов, которые имеют одинаковые идентификаторы четверти и года и класса и которые были в нескольких классах вместе.SQL-поиск отдельных пар

Так база данных выглядит следующим образом

Studentid courseid quarter  year 
11035 1020  Fall   2012  
11035 1092  Fall   2012  
75234 3201  Winter  2012  
8871 1092  Fall   2013  
39077 1092  Fall   2013  
57923 9219  Winter  2013  
60973 9219  Winter  2013  
19992 3201  Winter  2013  
60973 8772  Spring  2013  
90421 8772  Spring  2013  
90421 2987  Spring  2013  
60973 2987  Spring  2013 

результат, что я пытаюсь получить это:

Studentid student id year quarter course id 

60973 90421 2013 Spring 8772  
60973 90421 2013 Spring 2987 

до сих пор у меня есть

SELECT s.studentid, 
     st.studentid, 
     st.year, 
     s.quarter, 
     st.courseid 
    FROM enrolled s 
     LEFT JOIN enrolled st 
       ON st.COURSEID = s.COURSEID 
WHERE s.QUARTER = st.quarter 
    AND s.YEAR = st.year 
    AND s.studentid <> st.studentid 

но это дает мне каждая комбинация, которая может быть создана

+0

Какую базу данных вы используете? –

+0

Вы имеете в виду более одного класса вместе в любое время или в течение определенного квартала? –

+0

Вам нужны только пары или наборы из трех или более человек также разрешены? – wildplasser

ответ

1

автообъединение дважды - один раз за матч, и снова, чтобы найти другой матч:

SELECT s.studentid, st.studentid, s.year, s.quarter, s.courseid 
FROM enrolled s 
JOIN enrolled st ON st.COURSEID = s.COURSEID 
    AND st.quarter = s.quarter 
    AND st.year = s.year 
    AND s.studentid < st.studentid 
JOIN enrolled e2 ON e2.COURSEID != s.COURSEID 
    AND e2.quarter = s.quarter 
    AND e2.year = s.year 
    AND e2.studentid = st.studentid 

Выход:

| STUDENTID | OTHER_STUDENTID | YEAR | QUARTER | COURSEID | 
|-----------|-----------------|------|---------|----------| 
|  60973 |   90421 | 2013 | Spring |  2987 | 
|  60973 |   90421 | 2013 | Spring |  8772 | 

Посмотреть SQLFiddle

Примечания:

  • Вы хотите (внутреннее) соединение, а не левое соединение
  • Использование s.studentid < st.studentid остановить:
    • студентов присоединяющиеся к себе, и
    • обе стороны пары из отображения
  • Используйте другой курс для второго присоединиться, но тот же другой студент ID
+1

Это неправильный ответ: «и это было в нескольких группах вместе». Но он не заслуживает внимания. –

+0

@GordonLinoff Ох - пропустил более одного класса вместе. Исправлено: – Bohemian

+1

@GoatCO Пропустил «более одного». Исправлено. – Bohemian

0
SELECT a.*,b.courseid 
FROM (SELECT a.year 
        ,a.quarter 
        ,a.studentid AS Student1 
        ,b.studentid AS Student2 
      FROM enrolled a 
      JOIN enrolled b 
       ON a.COURSEID = b.COURSEID 
        AND a.QUARTER = b.quarter 
        AND a.YEAR = b.year 
        AND a.courseid = b.courseid 
        AND a.studentid < b.studentid 
      GROUP BY a.year, 
         a.quarter, 
         a.studentid, 
         b.studentid 
      HAVING COUNT(*) > 1) a 
JOIN enrolled b 
    ON a.year = b.year 
    AND a.quarter = b.quarter 
    AND a.Student1 = b.studentid 

SQL Fiddle

Я добавил строку в таблицу: (11035, 2987, 'Spring', 2013) Эта строка разбивает некоторые ответы, которые работают с вашими примерными данными. Вам понадобится статья HAVING, чтобы убедиться, что пара студентов имеет более 1 класса вместе в данном квартале.

0

Использование КТР для агрегата:

WITH pairs AS (
     SELECT distinct e1.Studentid AS student1 
     , e2.Studentid AS student2 
     FROM enrolled e1 
     JOIN enrolled e2 ON e1.courseid = e2.courseid AND e1.quarter = e2.quarter AND e1.year = e2.year 
     WHERE e1.Studentid < e2.Studentid 
     GROUP BY e1.Studentid,e2.Studentid 
     HAVING COUNT(*) > 1 
     ) 
SELECT e1.Studentid AS student1 
     , e2.Studentid AS student2 
     , e1.courseid 
     , e1.quarter 
     , e1.year 
FROM pairs p 
JOIN enrolled e1 ON e1.Studentid = p.student1 
JOIN enrolled e2 ON e2.Studentid = p.student2 
WHERE e1.courseid = e2.courseid AND e1.quarter = e2.quarter AND e1.year = e2.year 
     ; 
Смежные вопросы