SQL笔记 | 分区函数PARTITION BY、RANK()、DENSE_RANK()的使用

目录

数据

RANK()求排名

求两个班所有人的排名

nulls last

row_number()求排名

dense_rank()求排名

PARTITION BY分区函数

 求两个班各自排名

PARTITION BY 与 GROUP BY区别


数据

各个班级数据表

idnameclassgoal
1小明一班100
2小东一班90
3小红二班95
4小西二班80

RANK()求排名

求两个班所有人的排名

SELECT
  *,
	rank() OVER(ORDER BY goal desc) RANK
FROM
	"user"

结果(注意 goal类型因改为整型,如果为数字字符串类型需要转为整型比较)

id   name  class  goal  rank

1    小明    一班    100    1
3    小红    二班    95    2
2    小东    一班    90    3
4    小西    二班    80    4

此时存在相同分数,此时小红也为100分,则结果为

id   name  class  goal  rank

1    小明    一班    100    1
2    小东    一班    100    1
3    小红    二班    95    3
4    小西    二班    80    4

nulls last

当值为null,排序时会处于所有数据后

SELECT
  *,
	rank() OVER(ORDER BY goal desc nulls last) RANK
FROM
	"user"

结果(多个null具有相同名次)

id   name  class  goal  rank

1    小明    一班    100    1
2    小东    一班    100    1
3    小红    二班    95    3
4    小西    二班        4
5    小南    二班        4

row_number()求排名

SELECT
  *,
	row_number() OVER(ORDER BY goal desc) RANK
FROM
	"user"

结果

id   name  class  goal  rank

1    小明    一班    100    1
2    小东    一班    100    2
3    小红    二班    95    3
4    小西    二班    80    4

与RANK()区别在于如果两个分数相同则排名仍然递增,并不会出现1134这种更符合实际的排名

dense_rank()求排名

SELECT
  *,
dense_rank() OVER(ORDER BY goal desc) RANK
FROM
	"user"

结果

id   name  class  goal  rank

1    小明    一班    100    1
2    小东    一班    100    1
3    小红    二班    95    2
4    小西    二班    80    3

与与RANK()区别在于,同名词后面的名次

RANK() 1 1 3 4

dense_rank() 1 1 2 3

PARTITION BY分区函数

 求两个班各自排名

SELECT
  *,
	rank() OVER(PARTITION BY class ORDER BY goal desc) RANK
FROM
	"user"

结果为

id   name  class  goal  rank

3    小红    二班    95    1
4    小西    二班    80    2
1    小明    一班    100    1
2    小东    一班    100    1

PARTITION BY 与 GROUP BY区别

PARTITION BY 分区,根据相同条件分区,通过聚合函数,将结果合并至每一条数据后成为新的属性

如求每个人对应班级的总分

SELECT
	*,
	sum( goal ) over ( PARTITION BY class ) 
FROM
	"user"

结果(sum相加后的字段跟随在每个人的数据后,根据分区进行相加)

3    小红    二班    95    175
4    小西    二班    80    175
1    小明    一班    100    200
2    小东    一班    100    200

GROUP BY 分组,对所有数据的分组后处理,分组后,除了分组条件字段,其他字段需要通过聚合函数合并成一个值

如,求每个班级总分

SELECT
  sum(goal)
FROM
	"user"
	GROUP BY class

结果

一班    200
二班    175

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值