数据:
语文,60
数学,70
语文,0
语文,10
语文,20
数学,50
语文,50
数学,40
英语,52
英语,51
英语,59
英语,97
英语,98
英语,100
数学,80
数学,90
英语,61
结果要求如下:
语文,0,1
语文,10,1
语文,20,1
数学,40,2
数学,50,2
语文,50,3
英语,51,4
英语,52,4
英语,59,4
语文,60,5
英语,61,6
数学,70,7
数学,80,7
数学,90,7
英语,97,8
英语,98,8
英语,100,8
思路:
观察数据可知,需要对数据进行升序排序,排序之后的数据当科目发生变化时,后面的数字就加1, 所以可以用开窗函数lag(col,n,default_val),得到前一行数据,再判断科目名称是否相等,如果相等就返回0,不相同就返回1。最后进行开窗的sum()。
具体操作:
1.按成绩升序排序
select
subject,
score,
lag(subject) over(order by score asc) before_name
from stu_score;
结果如下:
subject score before_name
语文 0 NULL
语文 10 语文
语文 20 语文
数学

本文通过一个具体的案例展示了如何使用 Hive 的开窗函数处理数据。通过对成绩按升序排序,判断科目变化,利用 lag() 函数和 sum() 函数的结合,实现了当科目变化时计数加一的功能。在解决过程中,提到了因默认的 RANG BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 导致的问题,并给出了使用 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 解决方案,最终得到了正确的分组计数结果。
最低0.47元/天 解锁文章
3379

被折叠的 条评论
为什么被折叠?



