4

我在对 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
4

1 回答 1

3

假设您在表中没有实际的 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; 
于 2012-07-09T17:59:27.320 回答