2014-02-18 2 views
0

У меня есть таблица с повторяющимися реестрами студентов, но каждая строка представляет собой курс и статус этого учащегося.Сравните разницу между двумя строками в одной таблице

Я с помощью SQL Server 2008

Что-то вроде этого:

+--------+-------------+-------------------------+---------------+-----------------+ 
| ID | STUDENT |   DATE   | COURSE  |  STATUS  | 
+--------+-------------+-------------------------+---------------+-----------------+ 
| 21245 | ROBERTA ZOR | 2014-01-08 00:00:00.000 | CIÊNCIAS  | FORMADO   | 
| 39316 | IGOR BASTOS | 2008-04-07 00:00:00.000 | CIÊNCIAS  | CANCELADO  | 
| 39316 | IGOR BASTOS | 2014-01-08 00:00:00.000 | ADMINISTRAÇÃO | FORMADO   | 
| 39961 | LUIZ FELIPE | 2014-02-12 00:00:00.000 | ADMINISTRAÇÃO | CURSANDO  | 
| 105937 | DANIEL CHO | 2014-02-14 00:00:00.000 | ADMINISTRAÇÃO | CURSANDO  | 
| 105937 | DANIEL CHO | 2014-02-10 00:00:00.000 | ADMINISTRAÇÃO | RESERVA DE VAGA | 
+--------+-------------+-------------------------+---------------+-----------------+ 

мне нужна самая последняя СТАТУСА от комбинации СТУДЕНТА/курс для всех студентов.

UPDATE

Чтобы получить статус я использую другой присоединиться:

SELECT a.ID, a.STUDENT, a.COURSE, MAX(a.DATE) as DATE 

into #TABLE 
FROM #STUDENTS a 
INNER JOIN #STUDENTS b 
on a.ID = a.ID 
and a.COURSE = b.COURSE 
and a.STATUS <> b.STATUS 
GROUP BY a.ID,a.STUDENT, a.COURSE 


select c.ID, c.STUDENT, c.COURSE, c.STATUS 
into #FINAL_TABLE 
from #TABLE t 
inner join #STUDENTS C 
on C.ID = T.ID and C.STUDENT = T.STUDENT and C.COURSE = T.COURSE 
+2

ожидаемый выход? – OGHaza

+0

Я обновил таблицу. В случае с Дэниелом Чоем мне нужен ряд с CURSANDO STATUS. –

+0

Вы ищете только тех студентов, которые изменили статус в рамках курса, или вы действительно ищете самый последний статус для каждого курса, в котором находится учащийся? –

ответ

1

Этот запрос будет найти самую последнюю строку для каждой комбинации Студентов/Курсов. Он использует Common Table Expression, чтобы найти самую последнюю дату для каждой комбинации STUDENT/COURSE, а затем использует этот CTE для получения соответствующих строк. Конечным результатом является самая последняя строка для каждой комбинации STUDENT/COURSE.

WITH 
CTE_MostRecent AS (
    -- For each student/course combination, retrieve: 
    -- * student ID 
    -- * course 
    -- * date of most recent entry 
    SELECT ID, 
     COURSE, 
     MAX(DATE) AS MaxDate -- Most recent date 
    FROM StudentCourses 
    GROUP BY ID, 
      COURSE 
) 
SELECT S.* 
FROM StudentCourses AS S 
-- Only select the the most recent row 
-- for this STUDENT/COURSE combination 
INNER JOIN CTE_MostRecent AS M 
    ON S.ID = M.ID 
    AND S.COURSE = M.COURSE 
    AND S.DATE = M.MaxDate 

Выход (SQLFiddle):

╔════════╦═════════════╦═════════════════════╦═══════════════╦═══════════╗ 
║ ID ║ STUDENT ║  DATE   ║ COURSE  ║ STATUS ║ 
╠════════╬═════════════╬═════════════════════╬═══════════════╬═══════════╣ 
║ 105937 ║ DANIEL CHO ║ 2014-02-14 00:00:00 ║ ADMINISTRAÇÃO ║ CURSANDO ║ 
║ 39961 ║ LUIZ FELIPE ║ 2014-02-12 00:00:00 ║ ADMINISTRAÇÃO ║ CURSANDO ║ 
║ 39316 ║ IGOR BASTOS ║ 2008-04-07 00:00:00 ║ CIÊNCIAS  ║ CANCELADO ║ 
║ 39316 ║ IGOR BASTOS ║ 2014-01-08 00:00:00 ║ ADMINISTRAÇÃO ║ FORMADO ║ 
║ 21245 ║ ROBERTA ZOR ║ 2014-01-08 00:00:00 ║ CIÊNCIAS  ║ FORMAD ║ 
╚════════╩═════════════╩═════════════════════╩═══════════════╩═══════════╝ 

Примечание: Выход выше берется из фактического экземпляра SQL-сервера, а не из SQLFiddle. SQLFiddle отображает DATETIME значения, как "[MonthName] DD YYYY 14 HH: MM: SS + 0000"

Примечание: Это решение предполагает, что у вас есть не более одной записи в STUDENT/COURSE комбинации в день.

+0

Мне нужно последнее СОСТОЯНИЕ из комбинации STUDENT/COURSE для всех учащихся. –

+0

Я обновил свой ответ, чтобы показать, как это сделать. –

0

Этот запрос

SELECT a.id, a.student, a.course, MAX(a.date) as hight_date 
FROM table a 
INNER JOIN table b on a.course = b.course 
WHERE a.status != b.status 
GROUP BY a.id,a.student, a.course 
+0

Это работает, но это не говорит вам, что такое 'STATUS'. –

+0

, если вы хотите увидеть статус, добавьте столбец в группе выбора и группы по – Ganz

+0

. Ваш SQL некорректен. «INNER JOIN» только удостоверится, что для каждого «КУРСА» есть, по крайней мере, два разных значения «STATUS», независимо от того, к какому ученику они назначены. С текущими данными вы получаете те же результаты, удаляя их. Если все учащиеся в одном и том же «КУРСЕ» имеют только одно значение «СОСТОЯНИЕ» (и это то же самое), вы не получите для них строк. –

0
select * from 
    (select *,ROW_NUMBER()over(partition by COURSE,STATUS order by dates)rn 
    from @student)t4 where rn=1 
Смежные вопросы