Sql Oracle在多个字段上对列进行排名
我在Oracle中对某些列进行排名时遇到了一些问题。我需要对两列进行排序——一个组id和一个日期 我想以两种方式将表分组:Sql Oracle在多个字段上对列进行排名,sql,oracle,ranking,Sql,Oracle,Ranking,我在Oracle中对某些列进行排名时遇到了一些问题。我需要对两列进行排序——一个组id和一个日期 我想以两种方式将表分组: 按日期时间对每个组\u ID中的记录进行排名(排名\u 1) 按日期时间对组ID进行排序,组ID(排名2) 应该是这样的: GROUP_ID | DATE | RANK_1 | RANK_2 ----------|------------|-----------|---------- 2 | 1/1/2012 | 1
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;
这会错误地排列秩_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列,则似乎希望按每个组中最早的日期进行第二次排序。这将需要一个嵌套的子查询:
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;
第一种方式和第二种方式有何不同,因为在这两种情况下,分区都基于组id?