2023.11.16 hivesql高阶函数之开窗函数

news2024/11/28 12:38:26

目录

1.开窗函数的定义

2.数据准备

3.开窗函数之排序

 需求:用三种排序方法查询学生的语文成绩排名,并降序显示

 4.开窗函数分组

需求:按照科目来分类,使用三种排序方式来排序学生的成绩

 5.聚合函数与分组配合使用

6.聚合函数同时和分组以及排序关键字配合使用

--需求1:求出每个用户的总pv数,展示所有信息  默认第一行到最后一行

--需求2:求出每个用户截止到当天,累积的总pv数  默认第一行到当前行

做题思路,开窗函数核心:保证输出结果的记录数和输入的数据记录数一致 

7.窗口范围控制

1.默认第一行到当前行

2.第一行到当前行,等效于rows between ..不写,默认就是第一行到当前行

3.向前3行到当前行

4.向前3行 向后1行

 5.当前行到最后一行,第一行到最后一行

8.其他函数

    1.ntile平分:

注意ntile规则:尽量平均分配 ,优先满足最小(编号1)的桶,彼此最多不相差1个。

--需求:统计每个用户pv数最多的前3分之1天。--理解:将数据根据cookieid分 根据pv倒序排序 排序之后分为3个部分 取第一部分


1.开窗函数的定义

- 窗口:可以理解为操作数据的范围,窗口有大有小,本窗口中操作的数据有多有少。

- 可以简单地解释为类似于聚合函数的计算函数,但是通过GROUP BY子句组合的常规聚合会隐藏正在聚合的各个行,最终输出一行

-而窗口函数聚合后还可以访问当中的各个行,并且可以将这些行中的某些属性添加到结果集中。

开窗函数格式:  select ... 开窗函数 over(partition by 分组字段名 order by 排序字段名 asc|desc) ... from 表名; 

-- 如果有分组操作,select后的字段要么在聚合函数内,要么在group by 后出现

-- 开窗函数: hive和mysql8都能使用

-- 开窗函数本质在表后新增了一列

-- 聚合开窗函数: max min sum avg count

2.数据准备

数据文件score.txt

--数据准备
create table students(
    s_id int,
    s_name string,
    subject string,
    score double,
    class string
)row format delimited
fields terminated by '\t';

--加载数据
load data inpath '/input/score.txt' into table students;

--验证数据
select * from students;

 

3.开窗函数之排序

--查询最高分的学生
select max(score) from students; -- 99
-- 聚合函数配合over()使用,也可以叫开窗函数

--查询最高分的学生,并附上他的名字
select s_name,
       max(score) over()   --每一个学生都会匹配一个最高分,数据不正确
from students;

-- 排序开窗函数: row_number  rank  dense_rank

-- 排序函数必须配合over(order by 排序字段 asc|desc)

row_number: 巧记: 1234   特点: 唯一且连续

dense_rank: 巧记: 1223   特点: 并列且连续

rank   : 巧记: 1224   特点: 并列不连续

 需求:用三种排序方法查询学生的语文成绩排名,并降序显示

select s_name,subject,score,
       row_number() over (order by score desc ) ,--唯一且连续
       dense_rank() over (order by score desc ) ,--并列且连续
       rank() over (order by score desc ) --并列不连续
from students
where subject = '语文';

 4.开窗函数分组

-- 开窗函数分组

-- 注意不能用group by ,需要使用partition by,可以理解成partition by是group by的子句

-- 演示排序函数和分组配合使用: 先分组再组内排序

需求:按照科目来分类,使用三种排序方式来排序学生的成绩

select *,
       row_number() over (partition by subject order by score desc ),
       dense_rank() over (partition by subject order by score desc ),
       rank() over (partition by subject order by score desc )
from students;

 5.聚合函数与分组配合使用

-- 演示聚合函数和分组配合使用
-- 普通分组
select s_name,
       max(score)
from students group by s_name;

查询每个学生的信息,按照文理科分类,以及平均分

-- 开窗分组
select *,
       avg(score) over(partition by class)
from students;

6.聚合函数同时和分组以及排序关键字配合使用

-- 演示聚合函数同时和分组以及排序关键字配合使用
-- 数据准备
---建表并且加载数据
create table website_pv_info(
   cookieid string,
   createtime string,   --day
   pv int
) row format delimited
fields terminated by ',';

-- 建表
create table website_url_info (
    cookieid string,
    createtime string,  --访问时间
    url string       --访问页面
) row format delimited
fields terminated by ',';

-- 加载数据
load data inpath '/input/website_pv_info.txt' into table website_pv_info;
load data inpath '/input/website_url_info.txt' into table website_url_info;

-- 查询数据
select * from website_pv_info;
select * from website_url_info;

 

--需求1:求出每个用户的总pv数,展示所有信息  默认第一行到最后一行

cookie是记住用户记录的一个文件,代表一个用户

select *,
       sum(pv) over (partition by cookieid) 
from website_pv_info;

 

--需求2:求出每个用户截止到当天,累积的总pv数  默认第一行到当前行

--sum(...) over( partition by... order by ... ),在每个分组内,连续累积求和

select *,
       sum(pv) over (partition by cookieid order by createtime)
from website_pv_info;

做题思路,开窗函数核心:保证输出结果的记录数和输入的数据记录数一致 

7.窗口范围控制

rows between
   - preceding:往前
   - following:往后
   - current row:当前行
   - unbounded:起点
   - unbounded preceding 表示从前面的起点  第一行
   - unbounded following:表示到后面的终点  最后一行

1.默认第一行到当前行

select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime) as pv1
from website_pv_info;

2.第一行到当前行,等效于rows between ..不写,默认就是第一行到当前行

select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime
           rows between unbounded preceding and current row) as pv2
from website_pv_info;

3.向前3行到当前行

--向前3行至当前行
select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime
           rows between 3 preceding and current row) as pv4
from website_pv_info;

1+5+7=13   ,    1+5+7+3=16   ,  5+7+3+2=17  ,   7+3+2+4=16     ,   3+2+4+4=13

相当于查询今天以及前三天的总浏览量,在现实中常称为网站的'最近3天访问量'.

4.向前3行 向后1行

select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime
 rows between 3 preceding and 1 following) as pv5
from website_pv_info;

1+5+7+3+2=18  ,   5+7+3+2+4=21

 5.当前行到最后一行,第一行到最后一行

--当前行至最后一行
select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime 
rows between current row and unbounded following) as pv6
from website_pv_info;

--第一行到最后一行 也就是分组内的所有行
select cookieid,createtime,pv,
       sum(pv) over(partition by cookieid order by createtime 
rows between unbounded preceding  and unbounded following) as pv6
from website_pv_info;

8.其他函数

    1.ntile平分:

注意ntile规则:尽量平均分配 ,优先满足最小(编号1)的桶,彼此最多不相差1个。

其他开窗函数: ntile   lag和lead   first_value和last_value

ntile(x)功能: 将分组排序之后的数据分成指定的x个部分(x个桶)   
        注意ntile规则:尽量平均分配 ,优先满足最小(编号1)的桶,彼此最多不相差1个。

lag: 用于统计窗口内往上第n行值
lead:用于统计窗口内往下第n行值

first_value: 取分组内排序后,截止到当前行,第一个值
last_value : 取分组内排序后,截止到当前行,最后一个值

注意: 窗口函数结果都是单独生成一列存储对应数据

-- 演示ntile
--把每个分组内的数据均匀分为3桶
SELECT
    cookieid,
    createtime,
    pv,
    ntile(3) OVER(PARTITION BY cookieid ORDER BY createtime) AS rn2
FROM website_pv_info
ORDER BY cookieid,createtime;

--需求:统计每个用户pv数最多的前3分之1天。
--理解:将数据根据cookieid分 根据pv倒序排序 排序之后分为3个部分 取第一部分

with tmp as (SELECT
     cookieid,
     createtime,
     pv,
     NTILE(3) OVER(PARTITION BY cookieid ORDER BY pv DESC) AS rn
 FROM website_pv_info)
SELECT * from tmp where rn =1;

 


--lag 用于统计窗口内往上第n行值
select cookieid, createtime, url,
    row_number() over (partition by cookieid order by createtime) rn,
    lag(createtime, 1) over (partition by cookieid order by createtime) la1,
    lag(createtime, 2, '2000-01-01 00:00:00') over (partition by cookieid order by createtime) la2
from website_url_info;


--lead 用于统计窗口内往下第n行值
select cookieid, createtime, url,
    row_number() over (partition by cookieid order by createtime) rn,
    lead(createtime, 1) over (partition by cookieid order by createtime) la1,
    lead(createtime, 2, '2000-01-01 00:00:00') over (partition by cookieid order by createtime) la2
from website_url_info;


--FIRST_VALUE 取分组内排序后,截止到当前行,第一个值
select cookieid, createtime, url,
    row_number() over (partition by cookieid order by createtime) rn,
    first_value(url) over (partition by cookieid order by createtime) fv
from website_url_info;


--LAST_VALUE  取分组内排序后,截止到当前行,最后一个值
select cookieid, createtime, url,
    row_number() over (partition by cookieid order by createtime) rn,
    last_value(url) over (partition by cookieid order by createtime rows between unbounded preceding and unbounded following) fv
from website_url_info;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1216208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb Day10 案例-部门管理

目录 一、查询部门 (一)需求 (二)思路 (三)查询部门 (四)、前后端联调 二、删除 (一)需求 (二)思路 (三&#xf…

如何深度了解汤泉场所?VR全景给你答案

天气逐步转凉,温泉、水会这些室内汤泉场所开始登上消费的主战场。伴随着人们物质生活水平的提高,人们对休闲养生会馆的要求也愈发旺盛,汤泉场所也逐渐从单一的洗浴开始向休闲、娱乐、保健、桑拿等多种业态形式发展,那么大家如何深…

安全狗云安全体系为高校提升立体化纵深防御能力

客户情况 某高校有服务器500台,对外站点200个,核心交换流量20G。 客户痛点 校园网系统分类较多,并且每类网站中安全级重要程度又各不相同,同时有多个网络出口(如:教育网、电信网、移动网等),二级学院存在…

【java学习—十五】Thread类的有关方法(3)

文章目录 1. 基本方法2. 线程的优先级3. 进阶方法3.1. 举例3.1.1. 线程让步3.1.2. join() 方法3.1.3. sleep()方法3.1.4. stop() 方法3.1.4. isAlive() 方法 1. 基本方法 方法名作用void start()启动线程,并执行对象的 run() 方法run()线程在被调度时执行的操作Str…

电脑提示d3dcompiler43.dll缺失怎么解决?四种方法帮你轻松搞定!

d3dcompiler_43.dll是一个与DirectX相关的动态链接库(DLL)文件,它主要用于Windows操作系统上的图形和游戏应用程序。这个文件的主要作用是编译和解析DirectX应用程序中的图形代码。 DirectX是一个强大的图形API(应用程序编程接口&…

flutter项目中使用阿里图标库自定义图标步骤,5分钟搞定

因为flutter自带的图标可能并不能满足业务需求,所以需要加入图标非常丰富的阿里图标库的支持,阿里图标库的地址:iconfont-阿里巴巴矢量图标库,先看一下使用阿里图标库后的效果图:网页端和手机端都是可以正常运行的&…

Centos7安装frps作内网穿透--实现外部访问家里群晖

实现在外可访问家用群晖 需要在外界访问家里的局域网设备,正常情况是需要有公网IP,而IPV4作为家用,运营商基本不给,除非钞能力,IPV6可以用,但是有缺陷,需要互访的两端都是IPV6才能访问。选择fr…

关于400G光模块的常见问题解答

最近在后台收到了很多用户咨询关于400G光模块的信息,那400G光模块作为当下主流的光模块类型,有哪些问题是备受关注的呢?下面来看看小易的详细解答! 1、什么是400G QSFP-DD光模块? 答:400G光模块是指传输速…

Ubuntu16.04上安装Docker

Ubuntu16.04上安装Docker 更新 apt 包索引: sudo apt-get update安装依赖包,以便使用 HTTPS 仓库 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu…

rabbitMQ的direct模式的生产者与消费者使用案例

消费者C1的RoutingKey 规则按照info warn 两种RoutingKey匹配 绑定队列console package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DeliverCallback;/*** 消费者01的消息接受*/ p…

windows server 华夏ERP部署手册

软件包准备: .安装MySql 找到mysql程序双击进行安装,进入这个页面 选择Server only点击Next 进入到下图,点击execute,等待完成,点击下一步 点击install安装插件 安装完插件点击下一步 等待程序加载完成,点击下一步 继续下一步 进行下一步 进行…

智慧校园电子班牌 智能互联家校互通源码 springboot

利用先进的云计算技术,将教育信息化资源和教学管理系统进行有效整合,实现生态基础数据共享、应用生态统一管理,为智慧教育建设的统一性,稳定性,可扩展性,互通性提供保障的智慧教育一体化云解决方案。 在大数…

VIM去掉utf-8 bom头

Windows系统的txt文件在使用utf-8编码保存时会默认在文件开头插入三个不可见的字符(0xEF 0xBB 0xBF)称为BOM头 BOM头文件 0.加上BOM标记: :set bomb 1.查询当前UTF-8编码的文件是否有BOM标记: :set bomb? :set bomb? 2.BOM头:文…

麒麟信安助力长沙市就业与社保数据服务中心政务系统向自主创新演进

应用场景 长沙市就业与社保数据服务中心依托长沙市“政务云”的公共基础资源和相应的支撑能力,围绕社保、就业、人事人才、劳动关系等人社全量业务服务,力求建立以“智慧服务、智慧监管、智慧决策”为核心的“智慧人社”综合服务平台,实现人…

Java面向对象2

代码块 代码块的构造顺序优先于构造器 细节

shopee知虾数据:提升Shopee店铺运营效果必备工具—知虾数据工具

在如今竞争激烈的电商市场中,如何提升Shopee店铺的运营效果成为了每个卖家都关注的问题。而Shopee知虾数据工具作为一款专为Shopee虾皮平台设计的数据分析工具,为卖家提供了多项强大的功能,能够帮助卖家在开店、选款、测款、爆款以及初始和成…

flutter仿支付宝余额宝年化收益折线图

绘制: 1.在pubspec.yaml中引入:fl_chart: 0.55.2 2.绘制: import package:jade/utils/JadeColors.dart; import package:util/easy_loading_util.dart; import package:fl_chart/fl_chart.dart; import package:flutter/material.dart; import package:flutter_screenutil/…

【文件上传】01ctfer 文件上传获取flag

1.1漏洞描述 漏洞名称01ctfer 文件上传漏洞类型文件上传漏洞等级⭐⭐⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.环境搭建 1.创建docker-compose.yml文件 version: 3.2 services: upload: …

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日,拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观,集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流,旨在共同探讨携手合作,激发科…

kubernetes部署jenkins

参考:kubernetes 部署 Jenkins jenkins kubernetes pipeline_mob64ca14116c53的技术博客_51CTO博客 第七篇:kubernetes部署jenkins-CSDN博客 1、当前kubernetes集群已部署nfs服务 showmount -e 创建jenkins目录 2、添加jenkins的pvc kubectl create …