当前位置: 首页 > news >正文

【大数据Hive3.x数仓开发】窗口函数案例:连续N次登录的用户;级联累加求和;分组TopN

文章目录

    • 1 统计连续N次登录的用户(N>=2)
      • 自连接过滤实现
      • 窗口函数lead()实现
    • 2 级联累加求和
      • 自连接
      • 窗口函数sum()实现
    • 3 分组TopN问题

对窗口函数的讲解part见:【大数据Hive3.x数仓开发】函数–窗口函数

1 统计连续N次登录的用户(N>=2)

在这里插入图片描述

自连接过滤实现

连续两天登陆的用户ID:

select distinct a_userid
from tb_login_tmp
where a.user_id = b.user_id
and cast(substr(a_logintime,9,2) as int) -1 = cast(substr(b_logintime,9,2)as int);

窗口函数lead()实现

功能:用于从当前数据中基于当前行的数据向后偏移取值
语法:lead(colName,N,defautValue)

colName:取哪一列的值
N:向后偏移N行
defaultValue:如果取不到返回的默认值

分析:
我们可以基于用户的登陆信息,找到如下规律:
连续两天登陆:用户下次登陆时间 =本次登陆以后的第二天
连续三天登陆:用户下下次登陆时间=本次登陆以后的第三天
我们可以对用户ID进行分区,按照登陆时间进行排序,通过lead函数计算出用户下次登陆时间
通过日期函数计算出登陆以后第二天的日期,如果相等即为连续两天登录。

selectuserid,logintime--本次登陆日期的第二天,date_add(logintime,1) as nextday--按照用户id分区,按照登录日期排序,取下一次登录时间,取不到就为0,lead(logintime,1,0) over (partition by userid order by logintime) as nextlogin
from tb_login;

在这里插入图片描述

selectuiserid,logintime--本次登陆日期的第三天,date_add(login_time,2) as nextday--按照用户id分区,按照登陆日期排序,取下下一次登录时间,取不到为0,lead(logintime,2,0)over (partition by userid order by logintime) as nextlogin
from tb_login;
selectuserid,logintime,date_add(login_time,N-1) as nextday--按照用户id分区,按照登陆日期排序,取下下一次登录时间,取不到为0,lead(logintime,N-1,0)over (partition by userid order by logintime) as nextlogin
from tb_login;

2 级联累加求和

在这里插入图片描述

自连接

方案一:分组统计每个用户每个月的消费金额,然后构建自连接,根据条件分组聚合;

selecta.*,b.*
from tb_money_mth a join tb_mponey_mth b on a.ueserid=b.userid;

小tips:使用on a.ueserid=b.userid避免很多不必要的自连接!仔细观察笛卡尔积之后的数据,便于理解:在这里插入图片描述

where b.mth <a.mth --图中是排过序的

在这里插入图片描述
所以,最后自连接这样写:

--同个用户 同一个月的数据分到同一组 再根据用户、月份排序
selecta.userid,a.mth,max(a.m_money) as current)_mth_money--当月花费,sum(b.m_money) as accumulate_money--累计花费
from tb_money_mtn a join tb_money_mtn b on a.userid=b.userid
where b.mth<=a.mth
group by a.userid,a.mth
order by a.userid,a.mth;

可以看到代码很复杂,而且代码提前创建了tb_money_mtn 这个临时表,不然代码要实现嵌套查询。
在这里插入图片描述

窗口函数sum()实现

方案二:分组统计每个用户每个月的消费金额,然后使用窗口聚合函数实现。

--统计每个用户每个月消费金额及累计总金额
selectuserid,mth,m_money,sum(m_money) over (partition by userid order by mth) as t_money
from tb_money_mtn;

Q:如何实现只计算最近三个月的累计消费金额呢?
—使用rows between 来控制累积的行范围。

比如向前一行到向后两行:(partition by userid order by mth rows between 1 preceding and 2 following)

3 分组TopN问题

在这里插入图片描述

基于row_number实现,按照部门分区,每个部门内部按照薪水降序排序。

selectempno,ename,salary,deptno,row_number() over (partition by deptno order by salary desc) as rn
from tb_emp;

然后取rn<3的即可。

相关文章:

【大数据Hive3.x数仓开发】窗口函数案例:连续N次登录的用户;级联累加求和;分组TopN

文章目录1 统计连续N次登录的用户&#xff08;N>2&#xff09;自连接过滤实现窗口函数lead()实现2 级联累加求和自连接窗口函数sum()实现3 分组TopN问题对窗口函数的讲解part见&#xff1a;【大数据Hive3.x数仓开发】函数–窗口函数 1 统计连续N次登录的用户&#xff08;N&…...

openpyxl库自动填充excel实例分享

openpyxl可以通过编写Python脚本实现自动化Excel操作&#xff0c;包括自动填充数据、格式化单元格、生成图表等操作。 以下是一个常见的自动化Excel操作示例&#xff1a; 自动填充数据&#xff1a; from openpyxl import Workbook from openpyxl.utils import get_column_l…...

ICLR2021清华团队做的知识蒸馏提升detector的点的工作paper 小陈读论文系列

这个作者栏目就是一个词 清爽 牛逼不需要花里胡哨哈哈 无疑是有点tian了哈哈 不重要 毕竟有机会研读 梦中情笑的paper 还是很感激的 真的 很清爽啊 很多KD的工作确实 在下游任务呢效果不是很好 然后就引出了自己的关于提升知识蒸馏在OD方面的工作 OD 首先就有两个问题 1.前…...

Java核心技术知识点笔记—集合框架

前言&#xff1a;Java最初版本只为最常用的数据结构提供了很少的一组类&#xff1a;Vector、Stack、Hashtable、BitSet和Enumeration接口。其中&#xff0c;Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制。与现代数据结构类库常见情况一样&#xff0c;Java集…...

Rsync数据同步工具

一、什么是Rsync Rsync是一款开源的&#xff0c;快速的&#xff0c;多功能的&#xff0c;可实现全量及增量&#xff08;差异化备份&#xff09;的本地或远程数据同步备份的优秀工具。 Rsync软件适用于Unix、Linux、Windows等多种操作系统。 &#xff08;1&#xff09;可使本地…...

redux小结

store.dispatch(action对象) 在 dispatch 中调用 action 方法返回 action 对象 // /actions/index.js /*** Action&#xff1a;* action本质上是一个 JS 对象&#xff1b;* 必须要包含 type 属性&#xff0c;否则会报错&#xff1b;* 只描述了有事情要发生&#xff0c…...

【Python】【进阶篇】十、Pygame的Font文本和字体

目录十、Pygame的Font文本和字体10.1 font.SysFont()10.2 font.Font()10.3 字体对象方法十、Pygame的Font文本和字体 Pygame 通过pygame.font模块来创建一个字体对象&#xff0c;从而实现绘制文本的目的。 该模块的常用方法如下所示&#xff1a; 名称说明pygame.font.init()初…...

【从零开始学习 UVM】10.8、UVM TLM —— UVM TLM Example

文章目录 subComp1subComp2ComponentAsubComp3ComponentBTop Env/Test这个 UVM TLM 示例使用之前文章中讨论的 put 端口、TLM FIFO 和 get 端口来构建一个具有不同层次的 TLM 端口的测试台。 下面定义了一个名为Packet的类,作为从一个组件传输到另一个组件的数据项。这个类对象…...

获取自己所上传资源的下载量

import requestsurl = https://download-console-api.csdn.net/v1/user/sources/getUploadListByUserName?status=2&pageNum=1&pageSize=100 cookie = # 这里填自己的cookie header = {"authority": "download-console-api.csdn.net","met…...

Aspose.cells模板导出使用记录

简述 用Aspose.cells导出可以方便地将数据到Excel文档中&#xff0c;简单的直接将DataTable列表写入即可&#xff0c;复杂的格式一般会先做好模板&#xff0c;再将数据填充进去&#xff0c;这样可以保持设置好的样式&#xff0c;又能快速填充内容&#xff0c;十分方便。 智能…...

AcWing——糖果传递

有 n个小朋友坐成一圈&#xff0c;每人有 a[i]个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n&#xff0c;表示小朋友的个数。 接下来 n 行&#xff0c;每行一个整数 a[i]&…...

Redis中的单线程模型

文章目录 文件事件处理器模型Redis的客户端与服务端的交互过程图Redis基于Reactor模式开发了自己的网络事件处理器,称之为 文件事件处理器(File Event Hanlder)。 文件事件处理器由Socket、IO多路复用程序文件事件分派器(dispather)事件处理器(handler)文件事件处理器模型 IO…...

Python函数默认参数设置(超级详细)

我们知道&#xff0c;在调用函数时如果不指定某个参数&#xff0c;Python 解释器会抛出异常。为了解决这个问题&#xff0c;Python 允许为参数设置默认值&#xff0c;即在定义函数时&#xff0c;直接给形式参数指定一个默认值。这样的话&#xff0c;即便调用函数时没有给拥有默…...

人工智能如何赋能业务创新?安克创新有话要说

对于一家企业来说&#xff0c;应该如何运用人工智能技术助力业务创新&#xff1f;作为一家多年复合增长率超过35%的企业&#xff0c;安克创新对这个话题无疑有着深切的体验感悟。飞速成长的消费电子企业众所周知&#xff0c;当下各行各业都在如火如荼地开展人工智能应用&#x…...

如何学习与学习的本质

如何学习两种模式两种记忆方式拖延问题学习方法学习本质两种模式 专注模式发散模式 专注模式和发散模式可以进行切换&#xff0c;提高效率&#xff0c; 发散模式可以后台工作。 两种记忆方式 工作记忆&#xff08;前额叶皮质&#xff09;长时记忆&#xff08;图像比较容易记…...

C++ deque容器

C deque容器 文章目录C deque容器前言1. deque容器基本概念2. deque构造函数3. deque赋值操作4. deque大小操作5. deque 插入和删除6. deque 数据存取7. deque 排序总结前言 本文包含deque容器基本概念、deque构造函数、deque赋值操作、deque大小操作、deque插入和删除、deque…...

HashMap的底层原理

hashmap是一个以key,value形式存储的集合,在JDK1.7中是以数组链表的数据结构,在JDK1.8中是数组链表红黑树的数据结构,他在对数据操作时继承了数组的线性查找和链表的寻址修改 hashmap是线程不安全的 : 在JDK1.7中会造成环形链和数据丢失的情况 在JDK1.8中hashmap的put过程会造…...

Django 4.0文档学习(四)

上篇文章 Django 4.0文档学习&#xff08;四&#xff09; 文章目录编写你的第一个 Django 应用&#xff0c;第 6 部分自定义应用的界面和风格编写你的第一个 Django 应用&#xff0c;第 7 部分自定义后台表单自定义后台更改列表自定义后台界面和风格自定义后台主页编写你的第一…...

2023年全国最新高校辅导员精选真题及答案38

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 112.为改变重知识传授轻能力培养的大学课堂&#xff0c;教学方法可以采用&#xff08;&am…...

和ChatGPT-4聊完后,我觉得一切可能已经来不及了

了然无味&#xff0c;晴空万里&#xff01;和ChatGPT-4开始了一场坦诚的沟通&#xff0c;它全程都表现出高情商&#xff0c;以及不断尽量安抚我的情绪&#xff0c;而这&#xff0c;恰恰令我脊背发凉。 部分文字截取 ZM&#xff1a;我能不能理解每次对话就是一次你的“生命” G&…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...