Oracle如何按日期降序、序列升序两个字段实现排名
SQL混合排序方向排名实现方案
你此前对RANK函数的认知存在偏差:所有支持窗口函数的数据库,窗口函数的ORDER BY子句都支持为每个排序字段独立指定升序(ASC,默认值)或降序(DESC),不需要所有字段统一排序方向,完全可以满足你的需求。
适用场景及对应实现
根据你的排名规则要求:先按Date字段降序排序,日期相同再按Seq字段升序排序,不同排名需求对应写法如下:
- 如果你需要的是示例中连续不跳号、无并列排名的结果,使用
ROW_NUMBER函数即可,输出和你的示例完全匹配:
SELECT ID, Date, Seq, ROW_NUMBER() OVER (ORDER BY Date DESC, Seq ASC) AS Rank FROM 你的表名;
- 如果你需要相同Date和Seq的记录获得相同排名、后续排名跳号,使用
RANK函数:
SELECT ID, Date, Seq, RANK() OVER (ORDER BY Date DESC, Seq ASC) AS Rank FROM 你的表名;
- 如果你需要相同Date和Seq的记录获得相同排名、后续排名不跳号,使用
DENSE_RANK函数,排序规则部分写法和上述完全一致。
以上写法在Oracle、MySQL 8.0+、PostgreSQL、SQL Server等所有支持标准窗口函数的数据库中都可以正常运行。
内容的提问来源于stack exchange,提问作者OracleUser2021
相关产品推荐
相关产品推荐

