2

次のクエリを作成しようとして問題が発生しています。

特定の週のすべてのピア レビューを完了していないすべての学生を選択します。

背景: 毎週、すべての生徒は同じグループの仲間をピアレビューする必要があります。

各グループは異なるサイズになる可能性があり、これが私が抱えている問題です.

これは私の現在のテストデータです:

査読表

学生テーブル

表 1: ピア レビュー テーブル
表 2: 学生テーブル。

これは私の最初のクエリで、作成したピア レビューの量に基づいてすべての学生をグループ化します。count(*)が各学生のグループのサイズよりも小さいかどうかを確認する必要があります。

SELECT * 
FROM peerreview
RIGHT JOIN student 
ON student. studentID = peerreview.reviewer
WHERE week = 11
GROUP BY studentID
HAVING Count(*) < ????
4

3 に答える 3

2

次のクエリは、同じグループのすべての学生をレビューした学生を返します。

 SELECT a.reviewer, 
       a.groupid 
FROM   (SELECT student2.studentID AS reviewer, 
               student1.groupid, 
               Count(*)           AS cnt 
        FROM   student student1 
               INNER JOIN peerreview 
                       ON student1.studentID = peerreview.reviewee 
               INNER JOIN STUDENT STUDENT2 
                       ON student2.studentID = peerreview.reviewer 
        WHERE  student2.groupid = student2.groupid 
               AND peerreview.week = 11 
        GROUP  BY student1.groupid, 
                  student2.studentID) a 
       INNER JOIN (SELECT groupid, 
                          Count(*) - 1 AS cnt 
                   FROM   student 
                   GROUP  BY groupid) b 
               ON a.groupid = b.groupid 
                  AND a.cnt = b.cnt 

SqlFiddleを参照してください

于 2012-05-28T09:55:44.183 に答える
1
Select S.StudentId As Reviewer
    , S1.StudentId As StudentYetToBeReviewed
    , Weeks.WeekNum
From Student As S
    Join Student As S1
        On S1.GroupId = S.GroupId
            And S1.StudentId <> S.StudentId
    Cross Join  (
                Select 7 As WeekNum
                Union All Select 11
                ) As Weeks
Where Not Exists    (
                    Select 1
                    From PeerReview As P1
                    Where P1.reviewee = S1.StudentId
                        And P1.Week = Weeks.WeekNum
                    )
Order By WeekNum, reviewer

これにより、レビュアーとレビュアーがレビューする必要のある人物のリストが週ごとに表示されます。実際のソリューションでは、週の Cross Join を、レビューが行われる週の個別のリストに置き換えたいと思うでしょう。

SQL フィドルのバージョン

于 2012-05-28T10:18:24.197 に答える
0
  select distinct s1.* 
  from student s1 inner join student s2 on s1.groupId = s2.groupeId
               left join peerreview pr on pr.revieweer = s1.studentId
                    and pr.reviewee =  s2.studentId
  where pr.Week = ? and  pr.revieweer is null and s1.studentId <> s2.studentId
于 2012-05-28T10:54:41.330 に答える