2016-08-23 3 views
2

У меня есть стол для студентов и таблица зачисления. У каждого учащегося может быть более одного зачисления, но только один текущий набор. Если я хочу получить текущую регистрацию студента, я должен выбрать верхнюю регистрационную запись для этого ученика.Как получить первую группу записей в MS SQL Server?

Пример запроса:

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

Этот запрос возвращает текущий набор на одного студента. Я хочу изменить указанный выше запрос, чтобы получить текущую регистрацию для нескольких студентов. То есть Я хочу выбрать первую 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:

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

Обратите внимание, что ваш запрос использует TOP без ORDER BY. Это плохая привычка - она ​​возвращает произвольную строку, которая может даже измениться при разных исполнениях. В общем, всегда используйте ORDER BY с TOP, если вы действительно не знаете, что делаете.

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 
Смежные вопросы