通过SQL分组排名

时间:2016-08-18 14:51:22

标签: sql teradata ranking

我有以下数据表名为" animal"我希望根据动物的克隆版本排名和分组。

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

我尝试使用以下代码,但它缺少我正在寻找的分组方面。因为这是它的回报。

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

这就是上面的代码返回的内容。

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...)以允许分组?

1 个答案:

答案 0 :(得分:0)

您需要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