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

news2024/12/27 14:38:20

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函数要获取去年 还有前年的数据,这样是不是很麻烦呢,我暂时也没办法。

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

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

相关文章

【正点原子STM32连载】 第十九章 窗口门狗(WWDG)实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十九…

Unreal Niagara粒子入门2

本次学习一下如何将Niagara参数暴露给蓝图、材质编辑器。 1.暴露参数给蓝图 首先在左侧Parmeters参数面板的User Exposed处创建参数: 然后将参数拖入到想要绑定的粒子字段上,例如这里绑定给粒子发射数: 在调用粒子时,可通过Se…

【Java EE 初阶】网络编程套接字UDP

目录 1.为什么需要网络编程? 2.什么是网络编程? 3.发送端和接收端 4.请求和响应 5.客户端和服务端 6.如何进行网络编程(Socket套接字) 1.如何进行网络编程 2.TCP与UDP的区别 1.流套接字:使用传输层TCP协议 2.…

5月跳槽会有风险,不跳也会有?

今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展,但在跳槽前我们也不能确定下家就是更好的归宿,这就更加需要我们审慎地去对待,不能盲目跳槽。 其次,我们离职和跳槽,其中的原因很大一部分是目前薪资不符合预期。 那…

Kyligence 客户案例招商银行批发业务分析平台获评金融数字化最佳实践案例

近日,“2023 爱分析金融数字化最佳实践案例”评选结果正式揭晓。Kyligence 携手招商银行申报的“招商银行‘火眼’批发业务分析平台”项目经过领先性、案例创新性、应用成熟度、价值创造等维度综合评选,最终获评“金融数字化最佳实践案例”。 招商银行“…

阿里 P9 推荐的 Spring 领域巅峰之作,直接颠覆了我对 Spring 的认知

写在前面 你第一次接触 spring 框架是在什么时候?相信很多人和我一样,第一次了解 spring 都不是做项目的时候用到,而是在网上看到或者是听到过一个叫做 spring 的框架,这个框架号称完爆之前的 structs 和 structs2,吸…

Jupyter设置指定的python环境

Jupyter设置指定的python环境 Jupyter在虚拟环境中启动 按理说在命令行执行如下命令 conda activate 环境名称激活一个conda环境,再打开jupyter,输入如下命令 jupyter notebook默认的python环境应该是刚刚激活的那个,但是我发现在window上…

git代码回滚是使用reset还是revert

时光不能回退,Git却允许我们改变历史。 想要让Git回退历史,有以下步骤: 使用git log命令,查看分支提交历史,确认需要回退的版本 使用git reset --hard commit_id命令,进行版本回退 使用git push origin命…

不需要策略模式也能避免满屏if/else

满屏if/else java 复制代码 public static void main(String[] args) { int a 1; if(a 1){ System.out.println("执行a1的逻辑"); }else if (a 2){ System.out.println("执行a2的逻辑"); }else if (a 3){ System.out.println("执行a3的逻辑&quo…

基于apache paimon实时数仓全增量一体实时入湖

用例简介 Apache Paimon(以下简称 Paimon)作为支持实时更新的高性能湖存储,本用例展示了在千万数据规模下使用全量 增量一体化同步 MySQL 订单表到 Paimon明细表、下游计算聚合及持续消费更新的能力。整体流程如下图所示,其中 …

R语言实践——rWCVP:世界维管植物名录的R包

rWCVP:世界维管植物名录的R包 介绍1. 参照github安装与简单例子1.1 安装rWCVP1.2 安装rWCVPdata1.3 github的例子 2. rWCVP原始文献阅读2.1 前言(背景)2.2 功能概要2.2.1 名称匹配(wcvp_match_names(), wcvp_match_exact(), wcvp …

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新定义

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时 网络安全新定义总结 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动…

在字节跳动做了6年测试,5月无情被辞,想给划水的兄弟提个醒

先简单交代一下背景吧,某不知名 985 的本硕,17 年毕业加入字节,以“人员优化”的名义无情被裁员,之后跳槽到了有赞,一直从事软件测试的工作。之前没有实习经历,算是6年的工作经验吧。 这6年之间完成了一次…

API接口测试—详情版(拼多多根据ID取商品详情)

一、为什么要做接口测试 做接口测试的原因主要有以下几个方面: 1. 确保接口功能正确性:接口是不同软件系统或者不同模块之间的数据传输和交互的通道,通过接口测试能够确保不同系统或者模块之间传递的信息准确无误,从而保证了整个…

微信小程序点击icon实现分享功能

1.小程序分享功能实现方式 小程序分享功能有两种方式,监听用户点击页面内转发按钮( 组件 open-type“share”)或右上角菜单“转发”按钮的行为,并自定义转发内容。 使用微信小程序的分享功能需要定义onShareAppMessage(Object obj…

Java基础 变量与数据类型

变量 为什么需要变量 一花一世界,如果把一个程序看做一个世界或一个社会的话,那么变量就是程 序世界的花花草草、万事万物。即,变量是程序中不可或缺的组成单位,最基 本的存储单元。 初识变量 变量的概念 内存中的一个存储区域…

工作几年,涨薪4K遭拒,后一天我就裸辞走了···

19年7月大学毕业,当时学的计算机科学专业。因为考研之后,秋招结束了。也没什么更多的岗位选择,就想着找个工作先干着,刚好有个亲戚在一家大厂公司上班说要招测试,所以就来做测试了。 虽然都是属于计算机大类&#xff0…

chatgpt赋能Python-python_nor

了解Python NOR 在Python编程语言中,NOR运算是一种逻辑运算符,用于反转两个变量的逻辑值。它是布尔运算中的一种,通常用于检查两个条件是否都不成立。 NOR运算有两个输入和一个输出,当输入为空或两个输入都为False时&#xff0c…

nuxt视频播放(踩坑)

展示效果: nuxt样例视频 1.安装vue-video-player插件 ①执行命令 npm i vue-video-player 或者 npm i vue-video-player5.0.2 后者直接安装对应版本号的插件 ②安装完之后 执行npm i ③安装不对应的版本会报错 ④注意安装版本 不是vue3.0的 请安装(“v…

【nginx】同一接口有时返回500(client_body_temp)

问题描述: 同一个接口,有能正常访问并返回的,有的访问未到服务器直接返回500。 查看nginx日志(error.log),发现open() "/nginx/client_body_temp/0000476534" failed (13: Permission denied)报…