【问题标题】:How To Rank In Oracle SQL Per Group For Whole Table?如何在整个表的每个组中对 Oracle SQL 进行排名?
【发布时间】: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 的排名结果?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用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 
    

    【讨论】:

    • 如此简单。非常感谢波迪卢斯卡。正是我需要的。我会尽快勾选选定的答案。干杯。
    • 只要你知道怎么做,一切都很简单:)
    猜你喜欢
    • 2019-12-21
    • 2021-01-23
    • 2021-10-14
    • 2023-03-03
    • 2015-09-14
    • 2017-04-14
    • 2021-10-03
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多