我有下表:
+----+------+------+
| id | cat1 | cat2 |
+----+------+------+
| 1 | A | foo |
| 2 | A | foo |
| 3 | A | bar |
| 4 | B | sci |
| 5 | B | ble |
| 6 | B | ble |
+----+------+------+
我想对子类别(cat2)进行排名。
期望的结果:
+----+------+------+------+
| id | cat1 | cat2 | res |
+----+------+------+------+
| 1 | A | foo | 1 |
| 2 | A | foo | 1 |
| 3 | A | bar | 2 |
| 4 | B | sci | 1 |
| 5 | B | ble | 2 |
| 6 | B | ble | 2 |
+----+------+------+------+
我使用 DENSE_RANK 和 PARTITION BY 来获得以下结果:
+----+------+------+------+
| id | cat1 | cat2 | res |
+----+------+------+------+
| 1 | A | foo | 2 |
| 2 | A | foo | 2 |
| 3 | A | bar | 1 |
| 4 | B | sci | 2 |
| 5 | B | ble | 1 |
| 6 | B | ble | 1 |
+----+------+------+------+
陈述:
SELECT DENSE_RANK() OVER (PARTITION BY cat1 ORDER BY cat2 asc) as res, t.*
FROM mytable t
ORDER BY id;
如您所见,我唯一缺少的是结果的顺序。目前,排名基于 cat2 的字母顺序。但是,我想保留 id 给出的顺序(请参阅所需的结果)。简单地改变我的 DENSE_RANK 的 ORDER BY 并不能解决问题。