SQL中分析函数first_value(),last_value,sum()over(pa。。。SQL中分析函数first_value(),last_value,sum() over(partition by…)详解
⾸先,⽣成有⼀张原始表score,s_id表⽰学⽣id,c_id表⽰课程id,s_core表⽰最后课程的成绩,表结构数据如下所⽰:
⾸先,按照课程c_id进⾏分组,按照成绩s_core进⾏排序
select*,row_number()over(partition by c_id order by s_score)rank_showfrom score
运⾏结果:
也就是说按照 c_id分组,s_score从⼩到⼤进⾏排序的话,s_id为06号的排第⼀,04号的排第⼆,以此类推。
1:FIRST_VALUE()
接着查看FIRST_VALUE()和LAST_VALUE(),它们的字⾯意思很直观了,就是取⾸尾记录值。同样sum()也应该是取对应分组后的值,写⼀段SQL测试⼀下:
在上⾯代码的基础上,我们查看分组排序后的结果中,第⼀个,s_id值是多少
select*,first_value(s_id)over(partition by c_id order by s_score)first_show from score;
结果显⽰:
也就是说,得到的结果是对应c_id的⾸个s_id的值。
2:LAST_VALUE()
接下来再看last_value(),这⾥的运⾏结果很可能与刚开始设想的结果不同。
select * ,last_value(s_id) over (partition by c_id order by s_score)last_show from score;
运⾏结果:
正常情况下,last_value()值,学⽣s_id为06的last_show,不应该是03吗?
其实可以这样去理解:last_value()默认统计范围是 rows between unbounded preceding and current row,也就是取当前⾏数据与当前⾏之前的数据的⽐较。
那么,如何像**first_value()**那样直接在每⾏数据中显⽰最后的那个数据呢?
在order by 条件的后⾯加上语句:rows between unbounded preceding and unbounded following
select * ,last_value(s_id) over (partition by c_id order by s_score rows between unbounded preceding and unbounded following
)last_show from score;
运⾏结果:
这样就在每⼀⾏结果中直接显⽰最后的结果了。
3:sum() over()
sum是对所要求的条件进⾏求和的意思,还是在上⾯的基础上,进⾏测试。
输⼊代码:
select * ,sum(s_id) over (partition by c_id order by s_score)sum_show from score;
运⾏结果:
value函数什么意思这⾥好像跟我们预先的⼜不⼀样,发现跟上⾯的**last_value()**⽅式相同,也就是根据当前⾏与当前⾏之前的历史数据进⾏求和。
如何像**first_value()**那样直接在每⾏数据中显⽰最后的那个数据呢?还是上⾯那样的⽅法:在order by 条件的后⾯加上语句:rows between unbounded preceding and unbounded following。
输⼊代码:
select * ,sum(s_id) over (partition by c_id order by s_score rows between unbounded preceding and unbounded following)sum_show from score;
运⾏结果:
结果与我们设想的⼀样!
4:总结
1:first_value()的结果容易理解,直接在结果的所有⾏记录中输出同⼀个满⾜条件的⾸个记录;
2:last_value()默认统计范围是 rows between unbounded preceding and current row,也就是取当前⾏数据与当前⾏之前的数据的⽐较,如果需要在结果的所有⾏记录中输出同⼀个满⾜条件的最后⼀个记录,在order by 条件的后⾯加上语句:rows between unbounded preceding and unbounded following。
3:sum( ) over(…):默认统计范围是 rows between unbounded preceding and current row,也就是取当前⾏数据与当前⾏之前的数据的求和,如果需要在结果的所有⾏记录中输出同⼀个满⾜条件的所有记录之和,在order by 条件的后⾯加上语句:rows between unbounded preceding and unbounded following。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论