码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【博学谷学习记录】超强总结,用心分享|Hive开窗函数


    文章目录

      • 场景
      • 演示数据
      • 创建表并加载数据
      • 查询验证
      • 分组排名
        • row_number
        • rank
        • dense_rank
      • 分组求和,平均,最大,最小
        • sum
          • over中常用关键字
          • rows between 子句,也叫window 子句
          • 只指定分区字段 partition by
          • 不指定rows between
          • 指定rows between
            • 从当前行的前3行开始到后1行结束
            • 从当前行到最后一行
        • avg,min,max的开窗函数与sum用法一致,把函数名改一下就可以了

    场景

    如果我们需要想对一组数据进行分组,我们通过会使用聚合函数group by,但是它有个缺点,每组数据只能返回一行数据,且只能返回分组字段和聚合字段,如果我们想在分组的同时还保留数据详细的信息,这时我们就可以使用窗口分析函数

    演示数据

    user1,2018-04-10,1
    user1,2018-04-11,5
    user1,2018-04-12,7
    user1,2018-04-13,3
    user1,2018-04-14,2
    user1,2018-04-15,4
    user1,2018-04-16,4
    user2,2018-04-10,2
    user2,2018-04-11,3
    user2,2018-04-12,5
    user2,2018-04-13,6
    user2,2018-04-14,3
    user2,2018-04-15,9
    user2,2018-04-16,7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    创建表并加载数据

    create table open_window(
        userid string,
        createtime string,
        pv int
    )
        row format delimited
        fields terminated by ',';
    
    load data local inpath '/export/testdatas/openwindow.txt' into table open_window;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    查询验证

    select * from open_window;
    
    • 1

    image.png

    分组排名

    row_number

    从1开始按顺序排序,不间断,无重复

    select *,row_number() over (partition by userid order by pv desc ) as rk from open_window;
    
    • 1

    image.png

    rank

    从1开始按顺序排序,有间断,有重复,碰到相同数据会显示相同排名,但是排名序号会有断层

    select *,rank() over (partition by userid order by pv desc ) as rk from open_window;
    
    • 1

    image.png

    dense_rank

    从1开始按顺序排序,无间断,有重复,碰到相同数据会显示相同排名,排名序号不会断层

    select *,rank() over (partition by userid order by pv desc ) as rk from open_window;
    
    • 1

    image.png

    分组求和,平均,最大,最小

    sum

    需要指定计算字段,排序方式,计算窗口(范围),前两者都会影响计算结果

    over中常用关键字

    partition by: 指定分区(组)字段
    order by: 指定排序方式,不指定默认整个分组为计算窗口
    rows between 指定计算窗口(范围), 不指定默认从第一行到当前行

    rows between 子句,也叫window 子句

    preceding:表示往前几行
    current row:表示当前行
    following:表示往后几行
    unbounded preceding:表示从第一行开始
    unbounded following:表示到最后一行终止

    只指定分区字段 partition by

    默认计算范围,整个分组

    select *, sum(pv) over (partition by userid) as sum from open_window;
    
    • 1

    image.png

    不指定rows between

    默认计算范围,第一行到当前行

    select *, sum(pv) over (partition by userid order by createtime) as sum from open_window;
    
    -- 等效写法
    select *, sum(pv) over (partition by userid order by createtime rows unbounded preceding) as sum from open_window;
    select *, sum(pv) over (partition by userid order by createtime rows between unbounded preceding and current row ) as sum from open_window;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image.png

    指定rows between

    从当前行的前3行开始到后1行结束

    指定计算范围从当前行的前3行开始到后1行结束

    select *, sum(pv) over (partition by userid order by createtime rows between 3 preceding and 1 following) as sum from open_window;
    
    
    • 1
    • 2

    image.png

    从当前行到最后一行
    select *, sum(pv) over (partition by userid order by createtime rows between current row and unbounded following) as sum from open_window;
    
    • 1

    image.png

    avg,min,max的开窗函数与sum用法一致,把函数名改一下就可以了

  • 相关阅读:
    上海亚商投顾:A股缩量调整 AIGC、Web3.0概念抢眼
    IT66021FN: Single-port HDMI 1.4 Receiver with 3D Support
    【智能家居项目】裸机版本——认识esp8266 | 网络子系统
    前端项目面试核心问题(持续更新)
    TCP IP网络编程(六) 基于UDP的服务器端、客户端
    物联网的常用几种协议
    苏宁api接口
    转载——比较器的原理
    Bootstrap的不同版本使用的CSS 预处理器的不一样的
    [附源码]计算机毕业设计JAVA校园跑腿系统
  • 原文地址:https://blog.csdn.net/xz842913787/article/details/127724230
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号