按分组排名 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
我有以下名为 "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