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