sql_窗口函数总结

sql 窗口函数总结:

  • 注意:mysql -8.0 才支持
1.窗口函数语法:
  • <窗口函数> over ( partition by <用于分组的字段名> order by <用于排序的字段名> )
    • demo:
      • row_number() over (partition by area order by product desc) as rank;
        # 降序排列后,第几行,就是第几名
        
  • <窗口函数>的位置,可以放以下两种函数:
    • 专用窗口函数,如rank, dense_rank, row_number等 (不需要加字段名:rank())
    • 聚合函数,如sum,avg,count,max,min等(使用时要加对应的字段名:sum(字段名))
2.窗口函数有以下功能特点:
  • 同时具有分组(partition by)和排序(order by)的功能
  • 不减少原表的行数,所以经常用来在每组内排名
3.注意事项
  • 3.1 窗口函数原则上只能写在select子句中
  • 3.2 partition by 可以省略,这样就只做排序不做分组
  • 3.3 dense_rank:当有并列排名时,只占一个排名(并列第1的有3个人,第4个人排名记为第2名)
  • 3.4 rank:当有并列排名时,有几个人就占几个排名(并列第1的有3个人,第4个人排名记为第4名)
4.窗口函数使用场景
  • 由于窗口函数不减少原表的行数,所以当需要“在每组内进行排名”时经常会被用到,例如:
    • 排名问题:按每个班级的成绩进行组内排名
    • topN问题:找出每个班级排名前N的学生
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spark SQL窗口函数是一种用于对数据进行分组和排序的函数。它可以在查询结果中创建一个窗口,然后在窗口内进行聚合、排序和分析操作。窗口函数的语法结构如下所示: <窗口函数>(参数) OVER ( [PARTITION BY <列清单>] [ORDER BY <排序用清单列>] [ASC/DESC] (ROWS | RANGE) <范围条件> ) 其中,关键字OVER表示这是一个窗口函数,不是普通的聚合函数。PARTITION BY子句用于指定分组字段,ORDER BY子句用于指定排序字段。ROWS/RANGE窗口子句用于控制窗口的尺寸边界,有两种选项:ROW表示物理窗口,数据筛选基于排序后的索引;RANGE表示逻辑窗口,数据筛选基于值。[1] 在Spark SQL中,窗口函数可以通过使用Column提供的over函数来实现。下面是一个示例代码,展示了如何使用窗口函数进行累加历史和全部统计: ```scala import org.apache.spark.sql.expressions._ val first_2_now_window = Window.partitionBy("pcode").orderBy("event_date") df_userlogs_date.select( $"pcode", $"event_date", sum($"duration").over(first_2_now_window).as("sum_duration") ).show ``` 以上代码使用了窗口函数sum来计算每个pcode和event_date的duration的累加值,并将结果命名为sum_duration。通过使用over函数和指定的窗口(first_2_now_window),我们可以在每个窗口内进行累加计算。最后,使用show方法展示结果。[3] 总结来说,Spark SQL窗口函数是一种强大的工具,可以在查询结果中创建窗口,并在窗口内进行聚合、排序和分析操作。它可以通过使用Column提供的over函数来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值