2

次の 2 つのテーブルを検討してください。

student_id  score   date
-------------------------
1           10      05-01-2013
2           100     05-15-2013
2           60      05-01-2012
2           95      05-14-2013
3           15      05-01-2011
3           40      05-01-2012


class_id        student_id
----------------------------
1               1
1               2
2               3

最新のスコア順に並べられた、少なくとも 1 人の学生のスコアが特定のしきい値を超えている一意の class_id を取得したいと考えています。

たとえば、スコアが 80 を超えるクラスのリストを取得したい場合、学生 2 の最新のスコアが 80 を超えているため、結果として class_id 1 が取得されます。

これを t-sql でどのように処理しますか?

4

4 に答える 4

2

日付の要件に基づいて編集するとrow_number()、結果を取得するために使用できます。

select c.class_id
from class_student c
inner join
(
  select student_id,
    score,
    date,
    row_number() over(partition by student_id order by date desc) rn
  from student_score
) s
  on c.student_id = s.student_id
where s.rn = 1
  and s.score >80;

デモで SQL Fiddle を参照してください

または、次を使用できますWHERE EXISTS

select c.class_id
from class_student c
where exists (select 1
              from student_score s
              where c.student_id = s.student_id
                and s.score > 80
                and s.[date] = (select max(date)
                                from student_score s1
                                where s.student_id = s1.student_id));

デモで SQL Fiddle を参照してください

于 2013-05-22T17:12:48.997 に答える
0

これでうまくいくはずです:

SELECT DISTINCT
   CS.Class_ID
FROM
   dbo.ClassStudent CS
   CROSS APPLY (
      SELECT TOP 1 *
      FROM dbo.StudentScore S
      WHERE CS.Student_ID = S.Student_ID
      ORDER BY S.Date DESC
   ) L
WHERE
   L.Score > 80
;

そして、ここに別の方法があります:

WITH LastScore AS (
   SELECT TOP 1 WITH TIES
   FROM dbo.StudentScore
   ORDER BY Row_Number() OVER (PARTITION BY Student_ID ORDER BY Date DESC)
)
SELECT DISTINCT
   CS.Class_ID
FROM
   dbo.ClassStudent CS
WHERE
   EXISTS (
      SELECT *
      FROM LastScore L
      WHERE
         CS.Student_ID = L.Student_ID
         AND L.Score > 80
   )
;

データとインデックスによっては、これら 2 つのクエリのパフォーマンス特性が大きく異なる場合があります。どれが他のものよりも優れているかどうかを確認するために、いくつか試してみる価値があります.

必要なスコアを持つ学生が 1 人だけ見つかるとすぐにエンジンが検索を停止するクエリのバージョンがあるようですが、現時点ではそれを達成する方法がわかりません。

于 2013-05-22T17:57:26.280 に答える