最近在开发时,遇到这样一个问题,需要从一个表提取每个招聘Id最新的招聘状态,首先说下,这个表的结构是这样的。
SELECT ZhaoPinId,ConfirmStatus,ID FROM dbo.TeacherConfirm ORDER BY ID DESC
这里的逻辑是,一个招聘ID同时对应着好几个招聘确认状态:
现在我需要提取每一个zhaopinId对应的最新的一个状态,如何提取呢,这里就用到了Partition By了,我们看下下面的SQL语句:
SELECT ZhaoPinId,ConfirmStatus,ID, Row_Number() over(Partition By ZhaoPinId Order by Id desc) AS RowId FROM TeacherConfirm
我们来看下Row_Number() OVER的定义:
Row_Number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
如此一来我们就可以先通过ZhaoPinId分组,然后在分组内根据Id降序,在每个分组内部生成一个RowId
那我们如何取得最新的状态呢,我们只需要取到每个分组内rowid=1的那条记录就可以了,以为ID是自增,降序后肯定是排在前面的就是最新的记录。
Select t.* FROM(Select ZhaoPinId,ConfirmStatus, Row_Number() over(Partition By ZhaoPinId Order by Id desc) RowID FROM TeacherConfirm) t WHERE t.RowID=1