在同一个表格中比较2行之间的差异
我有一张表格,里面有学生的重复注册表,但每行代表该学生的课程和状态。在同一个表格中比较2行之间的差异
我使用的是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 /课程的最新状态为所有学生。
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
这个查询将找到最新行为每个学生/课程组合。它使用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
组合最为一个条目。
我需要从组合STUDENT /课程的最新状态为所有学生。 –
我更新了我的答案,以说明如何做到这一点。 –
查询是
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
这有效,但它不会告诉你'STATUS'是什么。 –
如果您想查看状态,请在select和group中添加列 – Ganz
您的SQL存在缺陷。 'INNER JOIN'只确保每个'COURSE'至少有两个不同的'STATUS'值,不管他们被分配了什么学生。使用当前数据,通过删除它可以得到相同的结果。如果同一'COURSE'中的所有学生只有一个“STATUS”值(并且它是相同的),那么您将不会获得行。 –
select * from
(select *,ROW_NUMBER()over(partition by COURSE,STATUS order by dates)rn
from @student)t4 where rn=1
预计产量? – OGHaza
我更新了表格。 在Daniel Cho的情况下,我需要带有CURSANDO STATUS的行。 –
您是否只在寻找某个课程中的状态发生变化的学生,或者您是否正在寻找学生每个课程的最新状态? –