2012-09-06 30 views
1

我正在使用Oracle SQL Developer尝试从HR表中自动计算缺勤期间。此表具有以下相关字段: Person_Ref - 唯一人标识 START_DATE - 缺勤期开始的日期。 COMPDATE - 似乎是一个向下计数的6位数字,所以最小的数字是最近的数字。 我最终希望写一份声明,将每个人的缺席开始日期,最新的START_DATE(即最低的COMPDATE)和第三个最新的START_DATE排序,然后以数学方式计算它们之间的天数(该表包含数十年每个条目都针对PERSON_REF编制索引)。这是一项业务要求,用于报告12个月内超过3次缺勤期的情况(即最近3个缺勤期的开始日期全部在12个月内)。如何在整个表中对Oracle SQL Per Group进行排序?

我打算首先将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'; 

从那里我可以选择从结果第1 & 3日我的查询中的其余部分。

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

我真的很想知道的是,我怎样才能编写这个子查询来为表中的每个PERSON_REF返回每个PERSON_REF的排名结果呢?

回答

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 
+0

那么简单。非常感谢Podiluska。正是我需要的。只要它让我选中的答案将打勾。干杯。 –

+0

一切都很简单,只要你知道如何:) – podiluska