Sql 红移:按降序排列数量上的行数函数,将0作为排名1的值排序

Sql 红移:按降序排列数量上的行数函数,将0作为排名1的值排序,sql,amazon-redshift,Sql,Amazon Redshift,我有一个数据集,记录了学生在不同学科的成绩。我试图使用redshift中的row_number()函数,根据学生的总分按降序对他们进行排名。然而,数据集中几乎没有学生在所有科目中得分为0。查询将返回排名为1的学生,然后按照正确的顺序(降序)返回学生。如何确保得分为0的学生排在最后 您可以在行编号()中使用大小写表达式。: 如果您想将他们完全排除在排行榜之外: select . . ., (case when score > 0 then row_nu

我有一个数据集,记录了学生在不同学科的成绩。我试图使用redshift中的row_number()函数,根据学生的总分按降序对他们进行排名。然而,数据集中几乎没有学生在所有科目中得分为0。查询将返回排名为1的学生,然后按照正确的顺序(降序)返回学生。如何确保得分为0的学生排在最后

您可以在
行编号()中使用
大小写
表达式。

如果您想将他们完全排除在排行榜之外:

select . . .,
       (case when score > 0
             then row_number() over (partition by (score > 0)::int order by score)
        end) as score_seqnum

注意:我怀疑你真的想要
rank()
这样分数相同的学生会得到相同的排名。

我想问题不在于分数为0,而在于分数为NULL,如果NULL优先于其他值,你可以将查询重新编写为

select . . .,
       row_number() over (order by coalesce(score,-1) desc) as rnk
;

谢谢你,戈登。实际上我想要row_number(),因为我想要每个学生都有一个唯一的排名。但是,我不想遗漏总分为0的学生。我希望他们的排名最低。@praveen。这是第一个解决办法。顺便说一下,我认为红移中不需要
::int
,所以你的意思是:``选择。,(排序依据(分数>0)描述)```@praveen上的行数()。你仍然需要分数作为第二把钥匙。嗨,纳巴!是的,问题是在某些情况下分数为零。现在解决了这个问题。谢谢
select . . .,
       row_number() over (order by coalesce(score,-1) desc) as rnk
;