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

HiveSQL一天一个小技巧:如何将分组内数据填充完整?

0 需求

1 需求分析

需求分析:需求中需要求出分组中按成绩排名取倒数第二的值作为新字段,且分组内没有倒数第二条的时候取当前值。

如果本题只是求分组内排序后倒数第二,则很简单,使用row_number()函数即可求出,但是本题问题点在于没有倒数第二时候需要保留当前值,如何优雅求出呢?

使用row_number()函数得到如下结果

with data as(select 111 as stu_id, 'class1' as class_name, 69 as scoreunion allselect 113 as stu_id, 'class1' as class_name, 74 as scoreunion allselect 112 as stu_id, 'class1' as class_name, 80 as scoreunion allselect 115 as stu_id, 'class1' as class_name, 93 as scoreunion allselect 114 as stu_id, 'class1' as class_name, 94 as scoreunion allselect 124 as stu_id, 'class2' as class_name, 70 as scoreunion allselect 121 as stu_id, 'class2' as class_name, 74 as scoreunion allselect 123 as stu_id, 'class2' as class_name, 78 as scoreunion allselect 122 as stu_id, 'class2' as class_name, 86 as scoreunion allselect 9999 as stu_id, 'class3' as class_name, 99 as score)
select stu_id, class_name, score, row_number() over (partition by class_name order by score desc ) rn1from data

根据上述结果,如何取出倒数第二值?上层使用case when rn = 2 then score end ,看看效果

with data as(select 111 as stu_id, 'class1' as class_name, 69 as scoreunion allselect 113 as stu_id, 'class1' as class_name, 74 as scoreunion allselect 112 as stu_id, 'class1' as class_name, 80 as scoreunion allselect 115 as stu_id, 'class1' as class_name, 93 as scoreunion allselect 114 as stu_id, 'class1' as class_name, 94 as scoreunion allselect 124 as stu_id, 'class2' as class_name, 70 as scoreunion allselect 121 as stu_id, 'class2' as class_name, 74 as scoreunion allselect 123 as stu_id, 'class2' as class_name, 78 as scoreunion allselect 122 as stu_id, 'class2' as class_name, 86 as scoreunion allselect 9999 as stu_id, 'class3' as class_name, 99 as score)
select stu_id, class_name, score, case when  rn1 = 2 then score end as  res
from (select stu_id, class_name, score, row_number() over (partition by class_name order by score desc ) rn1--, row_number() over (partition by class_name order by score  ) rn2from data) t

倒数第二值是取出来了,但是还不符合要求,需求中要求该分组内生成的字段每一行全部为该值,如何做呢?这里有个小技巧,也是数据清洗的手段,如何将分组内空值用该分组内有值的值填充完整?我们采用max()函数开窗的技巧:max() over(partition by 分组字段),这样同一个组内的所有空值都会被赋值为同一个字段。SQL如下:


with data as(select 111 as stu_id, 'class1' as class_name, 69 as scoreunion allselect 113 as stu_id, 'class1' as class_name, 74 as scoreunion allselect 112 as stu_id, 'class1' as class_name, 80 as scoreunion allselect 115 as stu_id, 'class1' as class_name, 93 as scoreunion allselect 114 as stu_id, 'class1' as class_name, 94 as scoreunion allselect 124 as stu_id, 'class2' as class_name, 70 as scoreunion allselect 121 as stu_id, 'class2' as class_name, 74 as scoreunion allselect 123 as stu_id, 'class2' as class_name, 78 as scoreunion allselect 122 as stu_id, 'class2' as class_name, 86 as scoreunion allselect 9999 as stu_id, 'class3' as class_name, 99 as score)
select stu_id, class_name, score, max(case when  rn1 = 2 then score end ) over(partition by class_name)   as  res
from (select stu_id, class_name, score, row_number() over (partition by class_name order by score desc ) rn1--, row_number() over (partition by class_name order by score  ) rn2from data) t

我们看到其结果值越来越符合预期,但是对于分组内只有一个值的如何处理呢?这里我们需要辅助判断,我们可以采用采用min() =max()判断,也可以采用percent_rank()=0判断等等,这里我们采用min() =max()判断,只要最大值等于最小值说明就分组内值唯一,最终SQL如下:

with data as(select 111 as stu_id, 'class1' as class_name, 69 as scoreunion allselect 113 as stu_id, 'class1' as class_name, 74 as scoreunion allselect 112 as stu_id, 'class1' as class_name, 80 as scoreunion allselect 115 as stu_id, 'class1' as class_name, 93 as scoreunion allselect 114 as stu_id, 'class1' as class_name, 94 as scoreunion allselect 124 as stu_id, 'class2' as class_name, 70 as scoreunion allselect 121 as stu_id, 'class2' as class_name, 74 as scoreunion allselect 123 as stu_id, 'class2' as class_name, 78 as scoreunion allselect 122 as stu_id, 'class2' as class_name, 86 as scoreunion allselect 9999 as stu_id, 'class3' as class_name, 99 as score)
select stu_id, class_name, score, max(casewhen rn1 != rn2 and rn1 = 2  --正序和倒序值不等 则取倒数第二的值 (rn1=2的值)then scorewhen rn1 = rn2 then score   --正序和倒序值相等 则取当前值end) over (partition by class_name) res
from (select stu_id, class_name, score, dense_rank()  over (partition by class_name order by score desc ) rn1, dense_rank() over (partition by class_name order by score) rn2 --用来辅助判断-- , percent_rank() over (partition by class_name order by score) pr --也可以采用该函数辅助判断(pr=0时候)from data) t

2 小结

本文通过实际需求中的案例,讲解了如何将分组内空值补充完整的技巧,通过开窗,min()/max() over(partition by 分组字段)来补充,注意点max()函数中根据实际情况写case when语句,或构造符合实际需求的条件,往往数据清晰中会用到这一技巧

相关文章:

HiveSQL一天一个小技巧:如何将分组内数据填充完整?

0 需求1 需求分析需求分析:需求中需要求出分组中按成绩排名取倒数第二的值作为新字段,且分组内没有倒数第二条的时候取当前值。如果本题只是求分组内排序后倒数第二,则很简单,使用row_number()函数即可求出,但是本题问…...

【亲测可用】BEV Fusion (MIT) 环境配置

CUDA环境 首先我们需要打上对应版本的显卡驱动: 接下来下载CUDA包和CUDNN包: wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux.run sudo sh cuda_11.6.2_510.47.03_linux.runwget htt…...

【调试方法】基于vs环境下的实用调试技巧

前言: 对万千程序猿来说,在这个世界上如果有比写程序更痛苦的事情,那一定是亲手找出自己编写的程序中的bug(漏洞)。作为新手在我们日常写代码中,经常会出现报错的情况(好的程序员只是比我们见过…...

单目标应用:蜣螂优化算法DBO优化RBF神经网络实现数据预测(提供MATLAB代码)

一、RBF神经网络 1988年,Broomhead和Lowc根据生物神经元具有局部响应这一特点,将RBF引入神经网络设计中,产生了RBF(Radical Basis Function)。1989年,Jackson论证了RBF神经网络对非线性连续函数的一致逼近性能。 RBF的基本思想是…...

MTK平台开发入门到精通(Thermal篇)热管理介绍

文章目录 一、热管理组成二、Linux Thermal Framework2.1、thermal_zone 节点2.2、cooling_device 节点三、Thermal zones沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍MTK平台的热管理机制,热管理机制是为了防止模组在高温下工作导致硬件损坏而存在的…...

最好的 QML 教程,让你的代码飞起来!

想必大家都知道,亮哥一直深耕于 CSDN,坚持了好很多年,目前为止,原创已经 500 多篇了,一路走来相当不易。当然了,中间有段时间比较忙,没怎么更新。就拿 QML 来说,最早的一篇文章还是 …...

笔记(六)——stack容器的基础理论知识

stack是堆栈容器&#xff0c;元素遵循先进后出的顺序。头文件&#xff1a;#include<stack>一、stack容器的对象构造方法stack采用模板类实现默认构造例如stack<T> vecT&#xff1b;#include<iostream> #include<stack> using namespace std; int main(…...

Web前端学习:四 - 练习

三九–四一&#xff1a;百度页面制作 1、左右居中&#xff1a; text-align: center; 2、去掉li默认的状态 list-style: none; li中有的有点&#xff0c;有的有序&#xff0c;此代码去掉默认状态 3、伪类&#xff1a;hovar 一般显示为color: #0f0e0f&#xff0c; 当鼠标接触时…...

odoo15 标题栏自定义

odoo15 标题栏自定义 如何显示为自定义呢 效果如下: 代码分析: export class WebClient extends Component {setup() {this.menuService = useService("menu");this.actionService = useService("action");this.title = useService("title&…...

视觉SLAM十四讲 ch3 (三维空间刚体运动)笔记

本讲目标 ●理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 ●学握Eigen库的矩阵、几何模块使用方法。 旋转矩阵、变换矩阵 向量外积 向量外积&#xff08;又称叉积或向量积&#xff09;是一种重要的向量运算&#xff0c;它表示两个向量所形成的平行…...

问题解决:java.net.SocketTimeoutException: Read timed out

简单了解Sockets Sockets&#xff1a;两个计算机应用程序之间逻辑链接的一个端点&#xff0c;是应用程序用来通过网络发送和接收数据的逻辑接口 是IP地址和端口号的组合每个Socket都被分配了一个用于标识服务的特定端口号基于连接的服务使用基于tcp的流Sockets Java为客户端…...

前端代码优化方法

1.封装的css样式&#xff0c;增加样式复用性。如果页面加载10个css文件,每个文件1k&#xff0c;那么也要比只加载一个100k的css文件慢 2.减少css嵌套&#xff0c;最好不要嵌套三层以上 3.不要在ID选择器前面进行嵌套&#xff0c;ID本来就是唯一的而且权限值大&#xff0c;嵌套完…...

【批处理脚本】-1.16-文件内字符串查找增强命令findstr

"><--点击返回「批处理BAT从入门到精通」总目录--> 共9页精讲(列举了所有findstr的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中…...

三天吃透Redis面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

数据湖架构Hudi(三)Hudi核心概念

三、Apache Hudi核心概念 3.1 基本概念 Hudi 提供了Hudi 表的概念&#xff0c; 这些表支持CRUD操作&#xff0c; 可以利用现有的大数据集群比如HDFS做数据文件存储&#xff0c; 然后使用SparkSQL或Hive等分析引擎进行数据分析查询。 Hudi表的三个主要组件&#xff1a; 有序的…...

在数字优先的世界中打击知识产权盗窃

在当今数据驱动的世界中&#xff0c;全球许多组织所面临的期望和需求正在达到前所未有的水平。 为了迎接挑战&#xff0c;数据驱动的方法是必要的&#xff0c;需要有效的数字化转型来提高运营效率、简化流程并从遗留技术中获得更多收益。 但是&#xff0c;虽然数字优先方法可…...

机器学习算法原理——逻辑斯谛回归

文章目录逻辑斯谛回归二项逻辑斯谛回归模型极大似然估计多项逻辑斯谛回归模型总结归纳逻辑斯谛回归 写在前面&#xff1a;逻辑斯谛回归最初是数学家 Verhulst 用来研究人口增长是所发现的&#xff0c;是一个非常有趣的发现过程&#xff0c; b 站有更详细的背景及过程推导&…...

【华为OD机试 】最优资源分配/芯片资源占用(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 …...

600 条最强 Linux 命令总结

1、基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 &#xff08;SMBIOS / DMI&#xff09; hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器…...

python自学之《21天学通Python》(15)——第18章 数据结构基础

数据结构是用来描述一种或多种数据元素之间的特定关系&#xff0c;算法是程序设计中对数据操作的描述&#xff0c;数据结构和算法组成了程序。对于简单的任务&#xff0c;只要使用编程语言提供的基本数据类型就足够了。而对于较复杂的任务&#xff0c;就需要使用比基本的数据类…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...