SQL Change Rank基于值组中的任何值

时间:2014-05-01 17:45:56

标签: 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组,如果任何CODEs =某个值我想调整等级,那么我可以先按等级排序,然后按其他列排序。永远不确定如何在SQL中表达内容。

我试过了 CASE WHEN CODE = 'A' THEN 1 WHEN CODE = 'B' THEN 2 ELSE 3 END rank ORDER BY rank DESC

但是我想把这些ids保持在一起,我不想让它们分开,如果我不能以另一种方式解决它,我想在所有等级基础上做同样的事情?

关于SQL函数的思考?

1 个答案:

答案 0 :(得分:1)

您可以使用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

An SQLfiddle to test with