按分组排名 SQL

Ranking by Grouping in SQL

我有以下名为 "animal" 的数据 table,我想根据动物的克隆版本进行排名和分组。

Animal Clone_Version
dog    0
dog    0
dog    1
dog    2
dog    2

我试过使用以下代码,但它缺少我正在寻找的分组功能。因为这就是它 returns.

select 
x.animal
, x.clone_version
, row_number() over(partition by x.clone_version order by animal desc) 
from animal x

这就是上面的代码returns.

Animal  Clone_Version  RankGroup
dog      0              2
dog      0              1
dog      1              1
dog      2              2
dog      2              1

我想对它们进行分组排序,所以输出如下。

Animal  Clone_Version  RankGroup
dog      0              3
dog      0              3
dog      1              2
dog      2              1
dog      2              1

我是否需要在 from 子句中使用 select 语句,或者是否有某种方法可以重新配置 row_number() over(partition by....order by...) 以允许分组?

你需要 DENSE_RANK:

select 
x.animal
, x.clone_version
, dense_rank()
  over(partition by x.animal        -- for each animal
       order by clone_version desc) -- based on descending version
from animal x

但是如果你的克隆版本总是在增加,那就等于:

select 
x.animal
, x.clone_version
, MAX(clone_version)
  over(partition by x.animal) - clone_version + 1
from animal x