【发布时间】:2012-07-09 17:52:40
【问题描述】:
我在对 Oracle 中的某些列进行排名时遇到了一些问题。我需要对两列进行排名——一个组 ID 和一个日期。
我想以两种方式对表格进行分组:
- 按 DATETIME (RANK_1) 对每个 GROUP_ID 中的记录进行排名
- 按 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 上的分区?