首页 技术交流 ROW_NUMBER() OVER函数实际运用分组排序获取组内特定记录 正文

ROW_NUMBER() OVER函数实际运用分组排序获取组内特定记录

发布日期:2019年01月07日 17:33        阅读次数:1675

最近在开发时,遇到这样一个问题,需要从一个表提取每个招聘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



评论:

共 0 页 0 条记录,当前为第 1 页