HiveSQL一天一个小技巧:如何精准计算非连续日期累计值【闪电快车面试题】

news/2024/5/2 8:04:44/文章来源:https://blog.csdn.net/godlovedaniel/article/details/129318378

0 需 求

稀疏字段累计求和问题

1 问题分析

根据图片中数据变换的形式,可以看出是根据字段term补齐数据中缺失的日期,term为连续日期的个数,当为12时,表明由2018-12-21到2019-01-02连续日期个数为12,当补齐日期后,根据日期顺序求amount的累计值,注意的是,当日期补齐后,补齐的日期值是空的。此类问题在业务中经常出现,特别在求累计值时,如果日期不是连续的,很容易漏掉部分日期累计值,造成数据不完整。这类问题的核心点就是数据日期非连续,需要补齐连续的日期,那么如何补齐连续日期呢?看过我SQLBOY1000题专栏的同学应该明白有类似的题目,这里给出链接。

SQL重叠交叉区间问题分析--HiveSQL面试题30_莫叫石榴姐的博客-CSDN博客

HiveSql一天一个小技巧:如何构造连续日期_hive生成连续的日期_莫叫石榴姐的博客-CSDN博客

步骤1:根据数据日期,补全需要的连续日期

对于补齐连续日期,我们给出模板及核心语句

lateral view posexplode(split(space(term), '(?!$)')) temp as pos,val

其中space()函数表示取空格,目的是为了扩展数据使用,取多少空格由里面参数决定,split()中的正则(?!$)表示不是以空格结尾的就匹配,因为split()函数会多切出一个空格,我们需要去掉。

利用posexplode()函数生成索引,根据数据中的起始日期(min(value_date))+增长步长的方式可以补齐所有的日期。注意这里面是按月增长的,我们使用add_months函数,即

add_months(value_date, pos)

整体生成连续日期语句如下:

with data as
(select 'AAAA' as contract,'2018-12-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-03-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-06-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-09-21' as value_date,9439.30 as amount,12 as termunion allselect 'BBBB' as contract,'2018-12-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-02-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-06-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-09-02' as value_date,9439.30 as amount,10 as term
)
select contract, add_months(value_date, pos) value_date,termfrom (select contract, min(value_date) value_date, max(amount)     amount, max(term)       termfrom datagroup by contract) t1 lateral view posexplode(split(space(term), '(?!$)')) temp as pos,val

步骤2:用补齐的连续日期作主表关联数据表,并计算累计值。

注意:这里一定要用生成连续日期做主表与关联数据表,这样才能做累计计算时候不重不漏,此时

sum() over(partition by order by )中sum的值一定是数据表右表中的值,partition by和order by的值是主表中的值。

在准确计算非连续日期累计值的核心点也在于此,生成补齐的日期维度表一定是主表,然后去关联数据表。

最终具体SQL如下:

with data as
(select 'AAAA' as contract,'2018-12-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-03-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-06-21' as value_date,9439.30 as amount,12 as termunion allselect 'AAAA' as contract,'2019-09-21' as value_date,9439.30 as amount,12 as termunion allselect 'BBBB' as contract,'2018-12-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-02-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-06-02' as value_date,9439.30 as amount,10 as termunion allselect 'BBBB' as contract,'2019-09-02' as value_date,9439.30 as amount,10 as term
)select  dim.contract,dim.value_date,cast(sum(d.amount) over(partition by dim.contract order by dim.value_date)  as decimal(18,2)) amount,dim.term
from(select contract, add_months(value_date, pos) value_date,termfrom (select contract, min(value_date) value_date, max(amount)     amount, max(term)       termfrom datagroup by contract) t1 lateral view posexplode(split(space(term), '(?!$)')) temp as pos,val) dim
left join
(select contract,value_date,amountfrom data
) d
on dim.contract = d.contract and dim.value_date = d.value_date

结果如下:

2 小结

本文给出了一种非连续日期准确求解累计值的通用方法。通过本文可以学习到:

(1)连续日期的构造方法

(2)非连续日期准确求解累计值的方法

注意此类问题又叫稀疏字段累计求和问题

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

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

相关文章

计算机网络的166个概念你知道几个 第四部分

HTML:HTML 称为超文本标记语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的 Internet 资源连接为一个逻辑整体。HTML 文本是由 HTML 命令组成的描述性文本,HTML 命令可以说…

【LeetCode每日一题】——605.种花问题

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 贪心算法 二【题目难度】 简单 三【题目编号】 605.种花问题 四【题目描述】 假设有一个很长…

K8S 实用工具之二 - 终端 UI K9S

开篇 📜 引言: 磨刀不误砍柴工工欲善其事必先利其器 第一篇:《K8S 实用工具之一 - 如何合并多个 kubeconfig?》 像我这种,kubectl 用的不是非常溜,经常会碰到以下情况: 忘记命令,先…

BUU [ZJCTF 2019]Login

这是一道让我感觉很淦的题,整一天了才大致了解了来龙去脉 开始: 首先丢到虚拟机checksec一下看看有啥保护措施: 看到开了Canary,就已经感觉不妙了,接着丢到IDA里看看啥情况 一看,是令人痛苦的c风格的代码…

LeetCode-63. 不同路径 II

题目来源 63. 不同路径 II 递归 class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int row obstacleGrid.length-1;int col obstacleGrid[0].length-1;return process(row,col,0,0,obstacleGrid);}private int process(int row ,int col,int i…

Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等

最近收到私信问我在cesium上展示的一些三维数据是如何生产和处理的,这篇文章就给大家一次性讲个透彻。 首先我们来做做分类。市面上能接触到的,常见的,cesium上支持展示的三维数据大致分为以下几种: 1.倾斜摄影(osgb,obj) 2.点云数据(las,pts) 3.手工模型(gltf,…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务,想要调用,怎么找到对应的服务呢? 这里有组件的讲解 → SpringCloud组件…

跳表--C++实现

目录 作者有话说 为何要学习跳表?为了快,为了更快,为了折磨自己..... 跳表作用场景 1.不少公司自己会设计哈希表,如果解决哈希冲突是不可避免的事情。通常情况下会使用链址,很好理解,当有冲突产生时&#…

RTOS中信号量的实现与应用

RTOS中的信号量是一种用来协调多个任务间共享资源访问的同步机制。它可以保证多个任务之间访问共享资源的正确性和一致性,避免了因多任务并发访问造成的不可预期的问题。 信号量的实现 信号量的实现原理比较简单,主要包括两个部分:计数器和…

十大经典排序算法【快速了解】

文章目录一、算法分类二、经典排序算法总览三、算法复杂度四、代码实现一、算法分类 十种常见排序算法可以分为两大类: 比较类排序: 通过比较来决定元素间的相对次序由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非…

22. linux系统基础

递归遍历指定文件下所有的文件,而且你还可以统计一下普通文件的总个数,既然能统计普通文件,能统计其他文件吗?比如目录文件, 这个是main函数里面我们调用了 ,这个checkdird这个函数,需要传递一个…

[数据结构]:10-二叉排序树(无头结点)(C语言实现)

目录 前言 已完成内容 二叉排序树实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-BinarySearchTreeCommon.cpp 04-BinarySearchTreeFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言…

大数据框架之Hadoop:MapReduce(八)常见错误及解决方案

1、导包容易出错。尤其Text和CombineTextInputFormat。 2、Mapper中第一个输入的参数必须是LongWritable或者NullWritable,不可以是IntWritable. 报的错误是类型转换异常。 3、java.lang.Exception: java.io.IOException: Illegal partition for 13926435656 (4)&…

ZincSearch Java 客户端教程

ZincSearch Zinc 简单、强大,不了解的同学可以参见我之前的博客。今天我们这里谈谈 Java 环境如何集成 Zinc 客户端,跟如何使用的。 安装 Zinc 到 Github 的官方 Releases 下载: 我的是 Windows 开发环境,下载 zincsearch_0.4…

基于ANSYS的无约束梁的模态分析与实验结果比较

一、实验模型简介 该模型来源于文献:“Khatir, A., Capozucca, R., Khatir, S. et al. Vibration-based crack prediction on a beam model using hybrid butterfly optimization algorithm with artificial neural network. Front. Struct. Civ. Eng. 16, 976–98…

蓝桥杯第十四届校内赛(第三期) C/C++ B组

一、填空题 (一)最小的十六进制 问题描述   请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。   请将这个数的十进制形式作…

【mysql是怎样运行的】-InnoDB行格式

文章目录1 指定行格式的语法2 COMPACT行格式2.1 变长字段长度列表2.2 NULL值列表2.3 记录头信息(5字节)2.4 记录的真实数据3 Dynamic和Compressed行格式1 指定行格式的语法 CREATE TABLE 表名 (列的信息) ROW_FORMAT行格式名称ALTER TABLE 表名 ROW_FOR…

【C++知识点】位运算

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…

C语言刷题(4)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容又到了我们的复习啦,那么还是刷题噢,话不多说,让我们进入C语言的世界吧 BC55 简单计算器 BC56 线段图案 BC57 正方形图案 BC58 直角三角形图案 BC59 翻转直角三角形图案 BC60 带空格…

主流机器学习平台调研与对比分析

梗概 本报告主要调研目前主流的机器学习平台,包括但不限于Amazon的Sage maker,Alibaba的PAI,Baidu的PaddlePaddle。对产品的定位、功能、实践、定价四个方面进行详细解析,并通过标杆对比分析提出一套机器学习平台评价体系&#x…