HiveSQL中last_value和first_value函数的应用

概述

今天做一个数据分析,其中有一列数据有些有数据有些没数据,因此我们需要把每数据的进行补充进来因此我们需要使用last_value 函数和over 结合使用,但是遇到一个比较奇葩的问题不能按照预期进行处理。
新说原因: 由于我们要处理的列,不是 null 而是空字符导致函数失效

遇到这个问题我思考的几个思路:

  1. last_value 函数第一次用不熟悉,怀疑自己使用方法不对,因此官方文档, 百度各种找资料,最后确认自己理解的没问题
  2. 由于我们是用公司内部平台怀疑平台有问题,最后确认没问题
  3. 怀疑低版本的问题,咨询平台是hive 2.0,发现这个函数是0.1.1开始支持
  4. 自己造数据进行测试,发现没问题,自己造的数据用null,突然想起来是null和空字符串的问题导致的,经过验证确实是

函数说明:

first_value:函数用于返回当前第一个值。可开启true命令,跳过null值
last_value:函数用于返回当前最后个值。可开启true命令,跳过null值

LAST_VALUE 是 SQL 中的一个窗口函数,用于获取窗口内最后一个值。窗口函数在数据库查询中用于在某个特定的窗口范围内计算聚合、分析等操作。

LAST_VALUE(column_name) OVER (PARTITION BY partition_expression ORDER BY sort_expression [ASC | DESC] ROWS BETWEEN start AND end)

其中:

  • column_name:要获取最后值的列名。
  • PARTITION BY partition_expression:可选,指定分区表达式,用于将结果分成多个分区,类似于 GROUP BY。
  • ORDER BY sort_expression:指定用于排序的列或表达式。
  • ASC | DESC:可选,用于指定排序顺序,默认为升序。
  • ROWS BETWEEN start AND end:可选,用于指定窗口的范围。

last_value

数据:

 1   a      a      null  202301     2023011   b      b      null  null       2023021   null   c      null  null       2023031   d      null   null  null       2023042   a      a      null  202301     202301
-- 预期实现1   d      c      null  202301     2023042   a      a      null  202301     202301
select last_value(age) over(partition by a order by b,c desc)
SELECT *
FROM
(SELECT id,last_value(name,TRUE)    OVER (PARTITION BY id ORDER BY up_time) name,last_value(age,TRUE)     OVER (PARTITION BY id ORDER BY up_time) age,last_value(address,TRUE) OVER (PARTITION BY id ORDER BY up_time) address,last_value(ct_time,TRUE) OVER (PARTITION BY id ORDER BY up_time) ct_time,up_time,row_number() over (partition by id order by up_time desc ) as rank
FROM(select *from(select 1 as id,'a'  as name ,'a'  as age,null as address,202301 as ct_time,202301   as up_timeunion allselect 1 as id,'b'  as name ,'b'  as age,null as address,null   as ct_time,  202302 as up_timeunion allselect 1 as id,null as name,'c'   as age,null as address,null   as ct_time,  202303 as up_timeunion allselect 1 as id,'d'  as name ,null as age,null as address,null   as ct_time,  202304 as up_timeunion allselect 2 as id,'a'  as name ,'a'  as age,null as address,202301 as ct_time,  202301 as up_time) t)
)
WHERE rank=1
;SELECT *
FROM(SELECT id,last_value(name,TRUE)    OVER (PARTITION BY id ORDER BY up_time ROWS BETWEEN unbounded preceding and unbounded following) name,last_value(age,TRUE)     OVER (PARTITION BY id ORDER BY up_time ROWS BETWEEN unbounded preceding and unbounded following) age,last_value(address,TRUE) OVER (PARTITION BY id ORDER BY up_time ROWS BETWEEN unbounded preceding and unbounded following) address,last_value(ct_time,TRUE) OVER (PARTITION BY id ORDER BY up_time ROWS BETWEEN unbounded preceding and unbounded following) ct_time,up_time,row_number() over (partition by id order by up_time desc ) as rankFROM(select *from(select 1 as id,'a'  as name ,'a'  as age,null as address,202301 as ct_time,202301   as up_timeunion allselect 1 as id,'b'  as name ,'b'  as age,null as address,null   as ct_time,  202302 as up_timeunion allselect 1 as id,null as name,'c'   as age,null as address,null   as ct_time,  202303 as up_timeunion allselect 1 as id,'d'  as name ,null as age,null as address,null   as ct_time,  202304 as up_timeunion allselect 2 as id,'a'  as name ,'a'  as age,null as address,202301 as ct_time,  202301 as up_time) t))
WHERE rank=1
;
在上述sql中,使用last_value函数对每一个列按照主键id分组,取一个最新值,如果遇见null值,使用参数true进行忽略,最后再使用窗口函数row_number进行分组排序取最大一条数据即可实现数据合并。

在这里插入图片描述

first_value

CREATE TABLE data (id INT, value INT);INSERT INTO data (id, value) VALUES(1, NULL),(2, NULL),(3, NULL),(4, NULL),(5, 99),(6, NULL),(7, NULL),(8, 101),(9, NULL),(10, NULL);
selectid,value,--1、取第一个值。null也正常取值first_value(value) over(order by id),--2、第一行到当前行,取第一个非null的值first_value(value,true) over(order by id ),--3、取当前行,到最后行,第一个非null值。--业务需求:取当前行之后的,最近的非null值first_value(value,true) over(order by id rows between current row and unbounded following)
from data;

在这里插入图片描述

SELECT 
role_gid,
nd, --值为123、、、、28level_raw,battle_level_raw,coalesce(battle_level_raw,--取后面行第一个值(最接近)--函数含义:分组排序取组内第一个值.需求是:当前行的后面行的第一个值.true是忽略null值   否则跟原始值一样first_value(battle_level_raw,true  )  OVER(PARTITION BY role_gid ORDER BY nd  ROWS BETWEEN CURRENT ROW and UNBOUNDED FOLLOWING) ,取前面行最后值(最接近)--函数含义:分组排序取组内最后一个值.需求是:当前行的前面行的最后值.true是忽略null值   否则跟原始值一样last_value(battle_level_raw ,true ) OVER(PARTITION BY role_gid ORDER BY nd  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) battle_level_notnullfrom  nd_game_sd_sjmy.tmp_dws_user_adventure_role_bat_detail_di  ;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3-环境变量-JavaScript-axio-基础使用-lzstring-字符串压缩-python

文章目录 1.Vue3环境变量1.1.简介1.2.全局变量的引用1.3.package.json文件 2.axio2.1.promise2.2.安装2.3.配置2.3.1.全局 axios 默认值2.3.2.响应信息格式 2.4.Axios的拦截器2.4.1.请求拦截器2.4.2.响应拦截器2.4.3.移除拦截器2.4.4.自定义实例添加拦截器 3.lz-string3.1.java…

java项目数据库 mysql 迁移到 达梦

目录 一、下载安装达梦数据库 1、下载 2、解压 3、安装 二、迁移 三、更改SpringBoot 的 yml文件 1、达梦创建用户 2、修改yml 一、下载安装达梦数据库 1、下载 下载地址 https://eco.dameng.com/download/ 点击下载 开发版 (X86平台) , 然后选择操作系统并点击立…

“科技创新‘圳’在变革”2025深圳电子展

电子产业作为现代社会的核心驱动力之一,正以前所未有的速度发展。在这样的背景下,深圳作为中国的经济特区和创新高地,又一次迎来了备受瞩目的盛会——2025深圳电子展览会。本次展览会定于2025年4月9日至11日,在深圳会展中心&#…

剪画小程序:手机提取人声和伴奏

在音乐的海洋中,我们常常渴望更纯粹地感受歌手的嗓音魅力。 如今,有了 剪画,人声分离不再是难题! 想象一下,当您沉浸在一首动人的歌曲中,却希望更清晰地捕捉到歌手声音中的每一个微妙情感。 无论是经典老…

算能端侧 AI 盒子 Stable Diffusion 一秒一张图:AirBox BM1684X

本篇文章聊聊基于 端侧 AI 计算设备,20~30 瓦功耗运行大模型的算能 AirBox。 写在前面 去年的双十二的时候,在群里看到了一张照片,“手掌大小的 NUC”,但是能够跑大模型。 这个草就种下了。 今年 7 月初的时候,在上…

学习008-02-04-09 Assign a Standard Image(分配标准图像)

Assign a Standard Image(分配标准图像) This lesson explains how to associate an entity class with a standard image from the DevExpress.Images assembly. This image illustrates the entity class in the following sections of the UI: 本课介…

C# 知识点总结

入门 C#程序在.NET上运行,.NET framework包含两个部分: ①:.NET framework类库 ②:公共语言运行库CLR(.NET虚拟机) CLS(公共语言规范) CTS(通用类型系统) .N…

ubuntu20.04安装nginx,mysql8,php7.4详细教程,包成功

目录 1.更新索引 2.安装 Nginx 1.安装 Nginx: 2.启动 Nginx 服务并设置为开机自启: 3.开放防火墙的 80 端口: 4.检查 Nginx 是否正常运行: 3.安装 MySQL 8.0 1.首先,安装 MySQL 的仓库: 安装过程中你会看…

RewardBench:Evaluating Reward Models for Language Modeling

Leaderboard: https://hf.co/spaces/allenai/reward-bench Code: https://github.com/allenai/reward-bench Dataset: https://hf.co/datasets/allenai/reward-bench 在人类偏好的强化学习(RLHF)过程中,奖励…

【Vulnhub系列】Vulnhub_Seattle_003靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Seattle_003靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境准备 1、从百度网盘下载对应靶机的.ova镜像 2、在VM中选择【打开】该.ova 3、选择存储路径&#xff0…

【AI大模型】-- 应用部署

一、GPU价格参考 有些在京东就能买到:https://item.jd.com/10065826100148.html美国商务部限制 GPU 对华出口的算力不超过 4800 TOPS 和带宽不超过 600 GB/s,导致最强的 H100 和 A100 禁售。英伟达随后推出针对中国市场的 A800 和 H800。 H100 与 A100&…

CATIA V5R21安装包下载及图文安装教程

大家好,今天给大家分享下catia安装教程 注意安装前请退出杀毒软件,防止误报影响安装进程 下载链接:百度网盘 请输入提取码 提取码:ypc6 01 在电脑D盘新建文件夹命名为CATIA,将下载的软件压缩包放置在该文件夹。 鼠标右击【C…

淘宝测试环境治理实践

去年之前,阿里巴巴的淘天集团测试环境是以领域方式运作:不局限测试环境治理本身,从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后,测试环境治理策略理应由业务方自…

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

若能重回白宫,特朗普称将把比特币列为美国战略储备资产!

KlipC报道:当地时间7月29日,美国前总统特朗普参加比特币2024大会,并在会上宣布称,如果重返白宫,他将把比特币列为美国战略储备资产。讲话期间,比特币价格一度上涨到6.9万美元大关。 特朗普表示&#xff1a…

Photos框架 - 自定义媒体选择器(UI预览)

引言 在前面的博客中我们已经介绍了使用媒体资源数据的获取,以及自定义的媒体资源选择列表页。在一个功能完整的媒体选择器中,预览自然是必不可少的,本篇博客我们就来实现一个资源的预览功能,并且实现列表和预览的数据联动效果。…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求,并确保所有请求都能正确处理并报告其状态。 假设有一个场景:有一个任务列表,有单个任务的处理功能…

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘

Solution:打开cmd输入指令下载malplotlib pip install matplotlib

2024-07-27 Unity Excel —— 使用 EPPlus 插件读取 Excel 文件

文章目录 1 前言2 项目地址3 使用方法3.1 写入 Excel3.2 读取 Excel3.3 读写 csv 文件 4 ExcelSheet 代码 1 前言 ​ 前几日,一直被如何在 Unity 中读取 Excel 的问题给困扰,网上搜索相关教程相对古老(4、5 年以前了)。之前想用 …

力扣高频SQL 50题(基础版)第二十五题

文章目录 力扣高频SQL 50题(基础版)第二十五题619.只出现一次的最大数字题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第二十五题 619.只出现一次的最大数字 题目说明 MyNumbers 表: ------…