[数据分析--sql语法解析] sql中的排序问题---设置排名列

 排序问题是sql中一个常见的问题,若遇到不仅让某字段排序,并且生产一个排名列,该如何设计呢?

现有表如下:

   

 要求输出一个按照score降序的排名结果,排名列为新列,且相同分数为同一名次,且保证排名连续。

我们先分析一下,如何才会产生排名。这可以理解为比他大的分数有几个,或者他大于的分数有几个。若按照升序方式排列即1,2,3...那么就得看大于他的有几个,那么初步思路已经有了,就是寻找比他大的得分有几个。

比较需要两列数据,像这种对自身数据进行比较可以生成多个重复表进行不同命名的形式,然后进行非等值连接(因为是比较,肯定是非等值)

对比较结果进行计数,来得出排名。如果大于某得分的有1个那么该id应该排名第二,所以要大于等于才能获取数据为2。并且要求相同分数排名一致,所以还得对取得的对应数据进行去重。

select a.score,count(distinct b.score) 'rank'

from Score a , Score b

where a.score <= b.socre

group by a.score

order by a.score

为什么要加上group by ?如果不加上group by 就会输出一个记录,加上之后会对id进行分组查询,才能得到正确结果,但是为什么不加会只有一个输出呢,为什么只提取一个数据后就停止了?强行解释就是他需要对不同类别进行处理,但是题目要求相同的数据排名一样,所以不能对score进行分组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值