如何在Oracle SQL中对整个表的每个组进行排名?

如何在Oracle SQL中对整个表的每个组进行排名?,sql,oracle,Sql,Oracle,我正在使用Oracle SQL Developer尝试从HR表中自动计算缺勤时间。此表包含以下相关字段: Person\u Ref-唯一的个人标识符 开始日期-开始缺勤的日期。 COMPDATE-似乎是一个向下计数的6位数字,所以最低的数字是最近的。 我最终希望写一份声明,对每个人的缺勤开始日期进行排序,取最新的开始日期(即最低的COMPDATE)和第三个最新的开始日期,然后从数学上计算两个日期之间的天数(注意:此表包含缺勤十年,每个条目根据person REF进行索引)。这是一项业务要求,要求

我正在使用Oracle SQL Developer尝试从HR表中自动计算缺勤时间。此表包含以下相关字段: Person\u Ref-唯一的个人标识符 开始日期-开始缺勤的日期。 COMPDATE-似乎是一个向下计数的6位数字,所以最低的数字是最近的。 我最终希望写一份声明,对每个人的缺勤开始日期进行排序,取最新的开始日期(即最低的COMPDATE)和第三个最新的开始日期,然后从数学上计算两个日期之间的天数(注意:此表包含缺勤十年,每个条目根据person REF进行索引)。这是一项业务要求,要求报告12个月内缺勤超过3次的情况(即最后3次缺勤的开始日期均在12个月内)

我打算首先将PERSON\u REF、最新开始日期、第三个最新开始日期和COMPDATE提取到一个单独的表中,希望每个PERSON\u REF都有一行,然后在VisualStudio中执行其余的逻辑。然而,这正是我的SQL知识让我失望的地方

如果我为特定的人运行此语句,我可以很容易地返回排名日期。\u REF:

SELECT D57.PERSON_REF, D57.START_DATE, D57.COMPDATE, RANK() OVER (ORDER BY D57.COMPDATE asc) rnk
From D57
WHERE D57.PERSON_REF='050050713';
从那里,我可以从查询的其余部分的结果中选择第一个和第三个日期

但是,如果我删除WHERE命令,那么显然它只是按顺序排列整个表


我真正想知道的是,如何编写此子查询以返回表中每个PERSON\u REF的PERSON\u REF排名结果?

使用
Partition by
子句

SELECT 
    D57.PERSON_REF, D57.START_DATE, D57.COMPDATE, 
    RANK() OVER (PARTITION BY PERSON_REF ORDER BY D57.COMPDATE asc) rnk 
FROM D57 

使用
分区依据
子句

SELECT 
    D57.PERSON_REF, D57.START_DATE, D57.COMPDATE, 
    RANK() OVER (PARTITION BY PERSON_REF ORDER BY D57.COMPDATE asc) rnk 
FROM D57 

这么简单。非常感谢你,卢卡。正是我需要的。一旦允许,将立即勾选所选答案。干杯。只要你知道怎么做,一切都很简单:)太简单了。非常感谢你,卢卡。正是我需要的。一旦允许,将立即勾选所选答案。干杯。只要你知道怎么做,一切都很简单:)