SQL根据值组中的任何值更改排名

SQL根据值组中的任何值更改排名,sql,oracle,Sql,Oracle,我不是在寻找答案,而是在寻找我认为可能的答案。我有一个查询,查询结果如下: | ID | CODE | RANK | 我想根据代码的等级来得到这些结果 | 1 | A | 1 | | 1 | B | 1 | | 2 | A | 1 | | 2 | C | 1 | | 3 | B | 2 | | 3 | C | 2 | | 4 | C | 3 | 基本上,根据ID组,如果任何代码=某个值,我想调整排名,这样我就可以先按排名排序,然后再按其他列排序。永远不知道如何在SQL中表达事物 我试过了 当

我不是在寻找答案,而是在寻找我认为可能的答案。我有一个查询,查询结果如下:

| ID | CODE | RANK |
我想根据代码的等级来得到这些结果

| 1 | A | 1 |
| 1 | B | 1 |
| 2 | A | 1 |
| 2 | C | 1 |
| 3 | B | 2 |
| 3 | C | 2 |
| 4 | C | 3 |
基本上,根据ID组,如果任何代码=某个值,我想调整排名,这样我就可以先按排名排序,然后再按其他列排序。永远不知道如何在SQL中表达事物

我试过了
当code='A'时为CASE,当code='B'时为1,然后为2,否则为3结束秩
按等级说明排序

但是我想把ID放在一起,我不想把它们分开,我在想,如果我不能用另一种方法来解决它,我会根据最高级别来做所有级别相同的事情吗


考虑使用SQL函数吗?

您可以使用
MIN()OVER()
分析函数来获得每个组的最小秩值,然后按该值排序

WITH cte AS (
  SELECT id, code, 
    MIN(CASE WHEN code='A' THEN 1 WHEN code='B' THEN 2 ELSE 3 END)
    OVER (PARTITION BY id) rank
FROM mytable 
)
SELECT * FROM cte
ORDER BY rank, id, code

.

分区
。我知道有类似的东西存在,但只是不知道它叫什么。这使得我的查询速度有点慢,但我正在艰难地完成一个包含大量行的非常繁重的查询。反正我把它藏了一天,所以我们很好。非常感谢。