② 计算每个科目的排名,相同的分数排名相同,余下排名跳跃增加
select sname ,subject ,score ,rank() over(partition by subject order by score) rank1 from exam_score
结果如下:
③ 计算每个科目的排名,相同的分数排名相同,余下排名顺序增加
select sname ,subject ,score ,dense_rank() over(partition by subject order by score) rank1 from exam_score
结果如下:
3. ntile()函数 + over()搭配
ntile()函数有点乱入的感觉,你不知道给它分哪一类。该函数主要用 “数据切分”。如果说这个函数还有点用的话,就是他也可以对数据进行排序,类似于上面提到的row_number()函数。
① 对exam_score表,进行整张表切分
select sname ,subject ,score ,ntile(4) over() rank1 from exam_score
结果如下:
不信你下去试一下,ntile()里面不管写哪个数字,好像都可以。
② 对exam_score表,按照subject分组切分
select sname ,subject ,score ,ntile(4) over(partition by subject) rank1 from exam_score
结果如下:
即使是分组切分,你也会发现,这样毫无意义,因为score并没有排序。
② 对exam_score表,对score排序后,按照subject分组切分(最有用)
select sname ,subject ,score ,ntile(4) over(partition by subject order by score) rank1 from exam_score
结果如下:
注意: 仔细观察这种用法,基本可以等效row_number()函数,效果是一样的。
4. 偏移函数 + over()搭配
① 展示各位同学的“上次购买时间”和“下次购买时间”
注:对于第一天,显示 “first buy”;对于最后一天,显示 “last buy”;
select sname ,buydate ,lag(buydate,1,'first day') over(partition by sname order by buydate) as 上次购买时间 ,lead(buydate,1,'last day') over(partition by sname order by buydate) as 下次购买时间 from cost_fee
结果如下:
② 截止到当前日期,每位同学的“首次购买时间”和“最后一次购买时间”
select sname ,buydate ,first_value(buydate) over(partition by sname order by buydate) as 首次购买时间 ,last_value(buydate) over(partition by sname order by buydate) as 最后一次购买时间 from cost_fee
结果如下:
③ 展示每位同学的“首次购买时间”和“最后一次购买时间”
注意: 这里并没有说 “截止到当前日期”,请注意②③之间的区别呀。需求不同,结果就不同。
select sname ,buydate ,first_value(buydate) over(partition by sname order by buydate) as 首次购买时间 ,last_value(buydate) over(partition by sname ) as 最后一次购买时间 from cost_fee
结果如下: