2016-08-23 6 views
2

학생 테이블과 등록 테이블이 있습니다. 각 학생은 둘 이상의 등록을 할 수 있지만 현재 등록은 하나만 허용됩니다. 현재 학생 등록을 받고자한다면 그 학생의 최고 등록 기록을 선택해야합니다.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

도와 드리겠습니다. 도움이되었던 답변을 모두 upvote하고 문제가 해결되면 받아 들일 수있는 것으로 표시하십시오. –

+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 
관련 문제