1

我正在使用 Oracle SQL Developer 尝试从 HR 表中自动计算缺勤时间。此表具有以下相关字段: Person_Ref - 唯一人员标识符 START_DATE - 缺勤期开始的日期。COMPDATE - 似乎是一个向下计数的 6 位数字,所以最低的数字是最近的。我最终希望编写一个语句,对每个人的缺勤开始日期进行排名,取最新的 START_DATE(即最低 COMPDATE)和第三个最新的 START_DATE,然后用数学方法计算它们之间的天数(nb 这个表包含几十年的缺席时,每个条目都根据 PERSON_REF 编制索引)。这是一项业务要求,用于报告在 12 个月内缺勤超过 3 次的情况(即

我打算首先将 PERSON_REF、最新的 START_DATE、第三个最新的 START_DATE 和 COMPDATE 提取到一个单独的表中,希望每个 PERSON_REF 一行,然后在 Visual Studio 中执行其余的逻辑。然而,这是我的 SQL 知识让我失望的地方。

如果我为特定的 PERSON_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_REF 的每个 PERSON_REF 的排名结果?

4

1 回答 1

4

使用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 
于 2012-09-06T10:04:40.623 回答