比较同一个表中2行的差异

时间:2014-02-18 14:34:46

标签: sql sql-server

我有一张表有重复的学生注册表,但每行代表该学生的课程和状态。

我正在使用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 |
+--------+-------------+-------------------------+---------------+-----------------+

我需要所有学生组合STUDENT / COURSE的最新状态。

更新

要获取状态我正在使用另一个连接:

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

3 个答案:

答案 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-Server实例,而不是来自SQLFiddle。 SQLFiddle将DATETIME值显示为“[MonthName],DD YYYY 14 HH:MM:SS + 0000”

注意:此解决方案假设您每天STUDENT / COURSE组合最多只有一个条目。

答案 1 :(得分: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

答案 2 :(得分:0)

    select * from 
    (select *,ROW_NUMBER()over(partition by COURSE,STATUS order by dates)rn 
     from @student)t4 where rn=1