2016-08-23 12 views
2

私は学生テーブルと登録テーブルを持っています。各学生は複数の登録が可能ですが、現在の登録は1つだけです。学生の現在の登録を取得したい場合は、その学生のトップ登録レコードを選択する必要があります。MS SQL Serverでトップレコードグループを賢明にするには?

例クエリ:

select top 1 enrollmentid 
from enrollmenttable 
where enrollmenttable.studentid = studentid 
order by enrollmenttable.enrolldate desc 

上記のクエリは、一人の学生のための現在の登録を返します。上記のクエリを変更して、複数の生徒の現在の登録を取得できるようにします。私。私は複数の生徒IDの上位1レコードを選択したいと思います。

+0

質問を編集し、サンプルデータと希望する結果を提供してください。 –

答えて

0

実際には、クエリで明示的にデータを並べ替える必要があります。私の好みはこういうものだろう。

サンプルデータ

CREATE TABLE #EnrolmentData (StudentID int, EnrolmentID int) 
INSERT INTO #EnrolmentData (StudentID, EnrolmentID) 
VALUES 
(1,1001) 
,(1,1002) 
,(2,1003) 
,(3,1004) 
,(3,1005) 
,(3,1006) 

実際のクエリ

SELECT 
a.* 
FROM 
    (
     SELECT 
     StudentID 
     ,EnrolmentID 
     ,ROW_NUMBER() OVER(PARTITION BY StudentID ORDER BY StudentID, EnrolmentID) RowNum 
     FROM #EnrolmentData 
    ) a 
WHERE a.RowNum = 1 

結果。

StudentID EnrolmentID RowNum 
1   1001  1 
2   1003  1 
3   1004  1 

内側のクエリを実行して、それが何をしているのかを知ることができます(一時テーブルを作成したら)。作業しているデータタイプについて言及していないので、正しいフィールドで注文していることを確認してください。最も高い数値のEnrolmentIDが必要な場合(そしてフィールドがintの場合)、サブクエリの後にDESCを置きます。 DESC

SELECT 
a.* 
FROM 
    (
     SELECT 
     StudentID 
     ,EnrolmentID 
     ,ROW_NUMBER() OVER(PARTITION BY StudentID ORDER BY StudentID, EnrolmentID DESC) RowNum 
     FROM #EnrolmentData 
    ) a 
WHERE a.RowNum = 1 

結果

StudentID EnrolmentID RowNum 
1   1002  1 
2   1003  1 
3   1006  1 
+0

ありがとう:) ...それは働いた:) – Knight

+0

助けて幸いです。役に立つと思われる回答をアップアップし、問題が解決した場合はそれを受け入れてください。 –

+0

確かに:) .. – Knight

0

あなたはouter applyを使用することができます:あなたのクエリがORDER BYなしTOPを使用しています

select e.* 
from students s outer apply 
    (select top 1 e.* 
     from enrollments e 
     where e.studentid = s.studentid 
     order by enrollmentid desc 
    ) e; 

注意。これは悪い習慣です。異なる実行で変更される可能性のある任意の行を返します。一般に、ORDER BYTOPを使用するのは、本当にあなたがしていることを本当に知っていない限りです。

0

クエリは、所望の結果については、以下のクエリを使用してください。

WITH cte_enrollment 
AS 
(
SELECT ROW_NUMBER()OVER(PARTITION BY studentid ORDER BY enrolldate desc) AS RNO , 
    studentid,enrollmentid,enrolldate 
FROM student s 
JOIN enrollmenttable e 
      ON e.studentid = s.studentid 
) 

SELECT studentid,enrollmentid,enrolldate 
FROM cte_enrollment 
WHERE RNO=1 
関連する問題