【问题标题】:Oracle ranking columns on multiple fields多个字段上的 Oracle 排名列
【发布时间】:2012-07-09 17:52:40
【问题描述】:

我在对 Oracle 中的某些列进行排名时遇到了一些问题。我需要对两列进行排名——一个组 ID 和一个日期。

我想以两种方式对表格进行分组:

  1. 按 DATETIME (RANK_1) 对每个 GROUP_ID 中的记录进行排名
  2. 按 DATETIME、GROUP_ID (RANK_2) 对 GROUP_ID 进行排名

应该是这样的:

GROUP_ID  |    DATE    |   RANK_1  |  RANK_2
----------|------------|-----------|----------
    2     |  1/1/2012  |      1    |    1
    2     |  1/2/2012  |      2    |    1
    2     |  1/4/2012  |      3    |    1   
    3     |  1/1/2012  |      1    |    2
    1     |  1/3/2012  |      1    |    3

我能够做到前者,但无法弄清楚后者。

SELECT   group_id,
         datetime,
         ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY datetime) AS rn,
         DENSE_RANK() OVER (ORDER BY group_id) AS rn2
FROM     table_1
ORDER BY group_id;

这错误地排序了 RANK_2 字段:

GROUP_ID  |    DATE    |   RANK_1  |  RANK_2
----------|------------|-----------|----------
    1     |  1/3/2012  |     1     |    1
    2     |  1/1/2012  |     1     |    2
    2     |  1/2/2012  |     2     |    2
    2     |  1/4/2012  |     3     |    2
    3     |  1/1/2012  |     1     |    3

【问题讨论】:

  • 第一种方式与第二种方式有何不同,因为在这两种情况下,组 id 上的分区?

标签: sql oracle ranking


【解决方案1】:

假设您在表中没有实际的 id 列,您似乎希望按每个组中的最早日期排名第二。这将需要一个嵌套的子查询:

select group_id,  datetime, rn,
       dense_rank() over (order by EarliestDate, group_id) as rn2
from (SELECT group_id,  datetime, 
             ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY datetime) AS rn, 
             min(datetime) OVER (partition by group_id) as EarliestDate
      FROM table_1
     ) t
ORDER BY group_id; 

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多