hive如何实现oracle中复杂的update sql

hive3.1有update语法,但是目前没用还是采用的非事务表,所以我们用其他的办法来解决hive的update问题

简单的update

oracle

update student  set name='cclovezbf' where id=1

hive  

insert overwrite table student

select 

id,

if(id=1,'cclovezbf',name) name

from student

最近在改oracle 的pck为hivesql的时候 遇到了一个相对复杂一丢丢的update,特意来分享下如何处理。

oracle pck

 UPDATE DWDMDATA.DM_CE_F_PORTRAIT_CASH_FORECAST t
 SET (T.YIELD_ON, T.YIELD_OFF, T.YIELD_TOTAL) =
     (SELECT 
     T.INTEREST_INCOME_ON /
     AVG(T1.GROSS_CASH_GROUP_USD_ON + T1.GROSS_CASH_GROUP_CNY_ON + T1.GROSS_CASH_INVEST_ON) * 12,

     T.INTEREST_INCOME_OFF /
     AVG(T1.GROSS_CASH_GROUP_USD_OFF + T1.GROSS_CASH_GROUP_CNY_OFF + T1.GROSS_CASH_INVEST_OFF) * 12,

     T.INTEREST_INCOME_TOTAL /
     AVG(T1.GROSS_CASH_GROUP_USD_ON +T1.GROSS_CASH_GROUP_CNY_ON +T1.GROSS_CASH_INVEST_ON +T1.GROSS_CASH_GROUP_USD_OFF +T1.GROSS_CASH_GROUP_CNY_OFF +T1.GROSS_CASH_INVEST_OFF) * 12

     FROM DWDMDATA.DM_CE_F_PORTRAIT_CASH_FORECAST t1
     WHERE T1.PERIOD_ID IN
     (T.PERIOD_ID, TO_CHAR(ADD_MONTHS(TO_DATE(T.PERIOD_ID, 'YYYYMM'), -1), 'YYYYMM'))
     AND T.PERIOD_TYPE = T1.PERIOD_TYPE
     AND T.VERSION_NAME = T1.VERSION_NAME
     AND T.FORECAST_YEAR = T1.FORECAST_YEAR
     AND T.DATA_TYPE = T1.DATA_TYPE)
     WHERE T.PERIOD_TYPE = 'MONTH'
     AND T.FORECAST_YEAR = SUBSTR('${p_period_id}', 0, 4);

原始sql比较长 贴出来有兴趣的可以后面自己改写。

为了方便大家学习和阅读,自己建了一个类似的看起来轻松点的表

CREATE TABLE test.cc_test_update2(
period_id varchar(200),
name varchar(200),
yuwen NUMBER,
shuxue NUMBER,
avg_score number
)

INSERT INTO test.cc_test_update2 values('2019','cc' ,70    ,80  ,null)
INSERT INTO test.cc_test_update2 values('2020','cc' ,80    ,90  ,null)
INSERT INTO test.cc_test_update2 values('2021','cc' ,90    ,100 ,null)
INSERT INTO test.cc_test_update2 values('2019','zbf',75    ,85  ,null)
INSERT INTO test.cc_test_update2 values('2020','zbf',85    ,95  ,null)
INSERT INTO test.cc_test_update2 values('2021','zbf',95    ,105 ,null)

  

oracle的update

UPDATE test.cc_test_update2 t 
SET AVG_SCORE =(SELECT  avg((t.YUWEN +t1.SHUXUE)/2)
FROM test.cc_test_update2 t1  
WHERE t.name =t1.NAME  
AND t.PERIOD_ID IN (t1.PERIOD_ID ,t1.PERIOD_ID+1 ) )

这里update的具体含义是计算平均分,是当年的语文和数学的平均分 与 当年的语文和去年数学的平均分  这两个平均分的平均分

这里可能有点绕,没法我要给个含义给你们好理解。后面我会详细介绍

update后的结果 

以前我接触的update比较少,当时第一次看到这种sql还愣了一下,还需要花点时间理解下。

我们先看下每年的平均分

SELECT t.*,(YUWEN+SHUXUE)/2  FROM test.cc_test_update2 t 

这个没啥说的 三岁小孩都会的sql 

再看当前的shuxue和yuwen平均分与  当前的yuwen和去年shuxue的平均分

WITH  tmp AS (
    SELECT PERIOD_ID ,name,YUWEN ,SHUXUE ,
    lag(SHUXUE ,1,SHUXUE)over(PARTITION BY NAME ORDER BY PERIOD_ID  ) pre_shuxue
    FROM test.cc_test_update2 t 
    )
SELECT  t.*,
(YUWEN+SHUXUE)/2 当年的语文和数学平均分,
(YUWEN+pre_shuxue)/2 当前的语文和去年数据的平均分,
((YUWEN+SHUXUE)/2+((YUWEN+pre_shuxue)/2))/2  上面两个平均分的平均分
FROM tmp t 

 可以看到和我们上面update后的结果一模一样,

所以我们只需要把上面的结果insert下就好了。

此次改写sql有几个注意点。

1.需求是需要去年的数学分数的 所以我们需要使用lag函数 或者lead。

   还有注意首年是没有上一年的比如2019年的上一年是2018年我们没有数据,所以lag需要有个默认值就是我们的自己本身  (当年+当年)/2=当年。

2.上面使用的是avg函数 所以我们后面使用的是/2  为什么呢?因为t.PERIOD_ID IN (t1.PERIOD_ID ,t1.PERIOD_ID+1 ) 这里就是2年,

如果这里改为3年了呢?我们要除以3,同时lag函数要获取去年 还有前年的数据,这样是不是很麻烦呢,我暂时也没办法。

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

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

相关文章

LeetCode 49 字母异位词分组

LeetCode 49 字母异位词分组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/group-anagrams/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个字符串数组&#x…

PowerShell系列(四):PowerShell进入交互环境的三种方式

目录 1、Win键X 方式 2、使用微软自带的搜索功能 3、命令行运行方式 4、命令行窗口方式 5、使用第三方命令行软件(Terminal)开启PowerShell环境 6、PowerShell交互环境执行脚本的一些优势 7、小技巧 今天继续给大家讲解PowerShell相关的知识&…

发现一个好玩的东西:Markdown 使用 Emoji 表情

Markdown 使用 Emoji 表情 玩法1、复制和粘贴表情符号2、使用表情符号简码Markdown 定义列表 玩法 有两种方法可以将表情符号添加到Markdown文件中: 将表情符号复制并粘贴到Markdown格式的文本中或者键入emoji shortcodes。 1、复制和粘贴表情符号 在大多数情况…

鸿蒙Hi3861问题解决-[OHOS ERROR] clang not found, install it please

一、简介 在使用DevEco进行编译时出现[OHOS ERROR] clang not found, install it please问题,导致编译失败,这里做个问题记录。 二、解决 这种问题其实还是工具链安装不全造成的。 安装gn 这里用的是VSCode DevEco组件,里边包含了gn组件的安…

【分立元件】MOSFET如何用于同步整流

在电力电子中我们会使用二极管做开关,当二极管导时,相当于开关闭合,当二极管截止时,相当于开关断开。但是二极管在导通时的管压降在低压电源电路中是一个损耗来源,所以一般我们首选使用的是肖特基二极管,因为肖特基二极管的管压降比较低。 如下所示为非同步BUCK电源拓朴…

mybatis-plus实现逻辑删除(详细!)

文章目录 什么是逻辑删除?为什么用到逻辑删除?在springboot使用Mybatis-Plus提供的逻辑删除1、在application.yml配置2、 实体类字段上加上TableLogic注解演示 什么是逻辑删除? 逻辑删除的本质是修改操作,并不是真正的删除&#…

如何在华为OD机试中获得满分?Java实现【报数游戏】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 100个人围成一圈,每个人…

多线程 -- 线程安全问题(3)

本篇重点: 总结线程安全问题的原因以及解决办法 目录 synchronized 加锁关键字join 和 synchronized 的区别volatile 关键字 在上一篇中我们介绍了Thread类的基本使用方法, 本篇将会介绍有关于线程的安全问题 线程不安全的原因: 抢占式执行(罪魁祸首, 万恶之源) 多个线程修改同…

CTF入门指南

何为CTF ? CTF(Capture The Flag)夺旗比赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…

《逆商》我们该如何应对坏事件

关于作者 作者保罗史托兹博士是逆商理论的提出者和奠基人,他曾被《人力资源》杂志评为 “全球十大有影响力的思想家”。在二十多年前提出逆商理论之后,他一直在致力于帮助各行各业的人士提高逆商,在实践中积累了该领域大量的数据和经验。 关…

二叉树的认识

愚昧将使你达不到任何成果,并在失望和忧郁之中自暴自弃。 --达芬奇 目录 🍁一.二叉树的概念 🍁二.二叉树的特点,结构 🍁三.三种特殊的二叉树 🍁1.斜树 🍁2.满二叉树 …

redis

1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提…

基于计算机视觉的手势识别技术

一个不知名大学生,江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion:2023.5.2 Last edited: 2023.5.2 手语是一种主要由听力困难或耳聋的人使用的交流方式。这种基于手势的语言可以让人们轻松地表达想法和想法&…

雷达中的无源和有源的区别

常规雷达探测目标时,需要源源不断地发射无线电波,所以叫有源雷达( active radar)。有源雷达的优点是能自主搜索目标,因为它接收的是自己发射的电磁波,所以灵敏度高,分辨率好。但这种雷达易受目标的电磁干扰&#xff0c…

C语言进阶——字符函数和字符串函数(下)

在前面我们已经学习了strlen、strcpy、strcat、strcmp几个库函数,今天我们继续学习剩余的库函数。 上期链接: C语言进阶——字符函数和字符串函数(上)_wangjiushun的博客-CSDN博客 目录: 3、长度受限制的字符串函数…

不愧是字节出来的,太厉害了...

前段时间公司缺人,也面了许多测试,一开始瞄准的就是中级水准,当然也没指望能来大牛,提供的薪资在15-20k这个范围,来面试的人有很多,但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

文件包含的本质、预处理符号、# vs ##

何为头文件? 在C语言中,文件包含是一种常见的编程技术,它允许程序员在一个源文件中使用另一个源文件中的函数或变量。 文件包含通常使用#include预处理指令来实现。#include指令告诉预处理器将文件的内容插入到当前文件的指定位置中。 例如&a…

python学习-基础知识总结

(一)基础语法 1.1、注释 程序添加注释,可以用来解释程序某些部分的作用和功能,提高程序的可读性,注释有两种形式: 单行注释:#多行注释:单引号(注释内容)或双…

笔试强训 Day6

选择题 1.十进制变量i的值为100,那么八进制的变量i的值为() A 146 B 148C 144 D 142 本题很简单:100除8,取余数,直到商为零,最后反向的串起余数即可 2.执行下面语句后的输出为(&…

【Python从入门到进阶】21、爬虫相关概念介绍

接上篇《20、HTML页面结构的介绍》 上一篇我们正式进入了Python爬虫的实战教程,主要讲解了要爬取的HTML页面的结构。本篇我们来介绍爬虫的相关概念。 一、什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个…