2015-01-28 3 views
-1

у меня есть студенческий стол по SQL Server 2008 со следующими столбцами:Сортировка внутри групп

StudentID name SubjectID lastUpdatedDate 
------------------------------------------------------- 
100   abc  01   2013-03-12 04:59:06.430 
110   bbc  01   2013-03-12 03:59:06.430 
120   cbc  02   2013-03-12 04:58:08.320 
130   dbc  03   2013-03-12 02:58:11.320 
140   ebc  02   2013-03-12 04:59:06.430 

SubjectID относится к субъекту таблицы перекодировки:

SubjectID | SubjectDescription...... 

Хочу перечислить последнего изменения студенческий отчет по каждому типу предмета.
Последняя измененная запись определяется по убыванию на lastUpdatedDate.

Так что - результат приведенных выше данных следует:

100  abc  01 2013-03-12 04:59:06.430 
130  dbc  03 2013-03-12 02:58:11.320 
140  ebc  02 2013-03-12 04:59:06.430 

Есть ли способ это без создания временных таблиц?

+0

Просьба указать некоторые данные образца и ожидаемые результаты. –

ответ

1

Вы можете получить последнюю дату обновления для каждого SubjectID, а затем отфильтровать результат из исходной таблицы со INNER JOIN:

SELECT t1.* 
FROM tbl t1 
JOIN (SELECT SubjectID 
      , MAX(lastUpdatedDate) AS lastUpdatedDate 
     FROM tbl 
     GROUP BY SubjectID) t2 ON t1.SubjectID = t2.SubjectID 
           AND t1.lastUpdatedDate = t2.lastUpdatedDate 
1
select StudentId, name, SubjectId, lastUpdateDate 
from (select * 
     , row_number() over (partition by StudentId 
      order by lastUpdate desc) as RN 
    from Students) S 
where RN = 1 

будет часто видеть более высокую производительность с использованием оконных функций, чем эквивалентный запрос, который использует агрегат и самостоятельно присоединиться.

Обратите внимание, что в случае связей для lastUpdateDate один выбирается произвольно. Если вы хотите, чтобы все строки привязывались к выигрышу, используйте rank() вместо row_number().

Смежные вопросы