sql 关联使用id还是code_R语言实例:用glue批量生成SQL语句

背景

在数据开发中,有些情况下,需要手动生成批量SQL,只需改变某个参数,比如日期,从某天到某天。

之前有一个实例,是用 stringr::str_replace_all() 去实现,这次就用 glue 来做示例,会更便捷。

glue

glue , 是 tidyverse 项目的一部分,擅长处理长字符串和文本段落,支持在字符串中使用变量和表达式,书写较为自由、灵活。

glue主页 https://glue.tidyverse.org/

e35ff14c487b09d9321ca3dd8300dd29.png

目标

下面示例的表,是某WMS仓库每日库存快照。

在数据首次同步及初始化时,第一个日期分区包含了所有业务日期的数据。之后的每日分区中,只包含一天的业务数据。现需要将初始日期分区,改为独立的日期分区,使得每个日期分区只包含一天的业务数据。

SQL脚本中,${bizdate}是一个参数,批量生成的目标是改变参数,从 2020082620201125

备注:该问题可以通过动态分区一次性实现,这里用指定分区执行多次的笨方法。

insert overwrite table edw.dwd_wms_inv_snapshot_inventory_d partition (dt = '${bizdate}')
SELECT
id,
warehouse_code,
item_code,
bar_code,
lot_no,
quality,
company_code,
qty,
inventory_date,
created_dtm_loc,
updated_dtm_loc,
etl_insert_time
FROM edw.dwd_wms_inv_snapshot_inventory_d
WHERE dt = '20201125' 
and inventory_date = to_date('${bizdate}', 'yyyymmdd')
;

R语言实现

# 载入所需的R语言包
library(magrittr)  # 使用 %>% 这个 pipeline 
library(lubridate) # 日期处理
library(glue)      # 字符段落处理
# 生成日期向量,格式改为 `yyyymmdd` ,这是 dt 日期分区的目标格式
ymd(20200826):ymd(20201125) %>%
  as_date() %>%
  as.character.Date(format = "%Y%m%d") ->
  bizdate
  

# 检查是否符合预期
print(bizdate)
##  [1] "20200826" "20200827" "20200828" "20200829" "20200830" "20200831"
##  [7] "20200901" "20200902" "20200903" "20200904" "20200905" "20200906"
## [13] "20200907" "20200908" "20200909" "20200910" "20200911" "20200912"
## [19] "20200913" "20200914" "20200915" "20200916" "20200917" "20200918"
## [25] "20200919" "20200920" "20200921" "20200922" "20200923" "20200924"
## [31] "20200925" "20200926" "20200927" "20200928" "20200929" "20200930"
## [37] "20201001" "20201002" "20201003" "20201004" "20201005" "20201006"
## [43] "20201007" "20201008" "20201009" "20201010" "20201011" "20201012"
## [49] "20201013" "20201014" "20201015" "20201016" "20201017" "20201018"
## [55] "20201019" "20201020" "20201021" "20201022" "20201023" "20201024"
## [61] "20201025" "20201026" "20201027" "20201028" "20201029" "20201030"
## [67] "20201031" "20201101" "20201102" "20201103" "20201104" "20201105"
## [73] "20201106" "20201107" "20201108" "20201109" "20201110" "20201111"
## [79] "20201112" "20201113" "20201114" "20201115" "20201116" "20201117"
## [85] "20201118" "20201119" "20201120" "20201121" "20201122" "20201123"
## [91] "20201124" "20201125"

# 验证有多少天(向量长度):总共有 92 天
length(bizdate)
## [1] 92
# 在 glue 字符串中,是可以直接使用变量的,用 {} 引用起来即可
# 如果原字符串中包含{}符号,可以修改 glue(.open = "{",  .close = "}",) 中的参数改为其他符号
glue("insert overwrite table akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df partition (dt = '{bizdate}')
SELECT
id,
warehouse_code,
item_code,
bar_code,
lot_no,
quality,
company_code,
qty,
inventory_date,
created_dtm_loc,
updated_dtm_loc,
etl_insert_time
FROM akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df
WHERE dt = '20201125' 
and inventory_date = to_date('{bizdate}', 'yyyymmdd')
;") ->
  sql
# 因为 bizdate 是字符向量,故而 sql 在经过 glue() 函数中使用了 bizdate 计算之后
# sql 也是向量, 其长度保持与 bizdate 一致,也是 92,不需要再用 for 显式循环
length(sql)
## [1] 92
# 查看前两个SQL语句
head(sql, 2) %>% 
  cat(sep = "\n\n")
## insert overwrite table akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df partition (dt = '20200826')
## SELECT
## id,
## warehouse_code,
## item_code,
## bar_code,
## lot_no,
## quality,
## company_code,
## qty,
## inventory_date,
## created_dtm_loc,
## updated_dtm_loc,
## etl_insert_time
## FROM akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df
## WHERE dt = '20201125' 
## and inventory_date = to_date('20200826', 'yyyymmdd')
## ;
## 
## insert overwrite table akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df partition (dt = '20200827')
## SELECT
## id,
## warehouse_code,
## item_code,
## bar_code,
## lot_no,
## quality,
## company_code,
## qty,
## inventory_date,
## created_dtm_loc,
## updated_dtm_loc,
## etl_insert_time
## FROM akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df
## WHERE dt = '20201125' 
## and inventory_date = to_date('20200827', 'yyyymmdd')
## ;
# 查看后两个SQL语句
tail(sql, 2) %>% 
  cat(sep = "\n\n")
## insert overwrite table akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df partition (dt = '20201124')
## SELECT
## id,
## warehouse_code,
## item_code,
## bar_code,
## lot_no,
## quality,
## company_code,
## qty,
## inventory_date,
## created_dtm_loc,
## updated_dtm_loc,
## etl_insert_time
## FROM akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df
## WHERE dt = '20201125' 
## and inventory_date = to_date('20201124', 'yyyymmdd')
## ;
## 
## insert overwrite table akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df partition (dt = '20201125')
## SELECT
## id,
## warehouse_code,
## item_code,
## bar_code,
## lot_no,
## quality,
## company_code,
## qty,
## inventory_date,
## created_dtm_loc,
## updated_dtm_loc,
## etl_insert_time
## FROM akdc.ods_akc_wms_cloud_inv_snapshot_inventory_df
## WHERE dt = '20201125' 
## and inventory_date = to_date('20201125', 'yyyymmdd')
## ;
# 将结果写入到文件中(控制台显示不下)
sql %>%
  write(file = "out_put.txt", sep = "\n\n")

# 打开该目录新生成的txt文件就可以看到全部,复制出来即可
# 可直接用RStudio文件模块直接点击打开文本窗口,也可用记事本之类的软件打开

补充示例1

library(magrittr) # 使用 %>% 这个 pipeline 
library(glue)     # 字符段落处理


# 生成日期序列,并转为字符型,格式为 yyyy-mm-dd
seq(from = as.Date("2018-06-11"), 
    to = as.Date("2018-06-13"), 
    by = 1
    ) %>%
  as.character() ->
  seq_date

glue("insert overwrite table rpt.rpt_collection_appoint_stronger_in_daily partition (dt = '{seq_date}')
select appoint_stronger, count(case_id) as case_num
from edw.collection_case_strength_h
where to_date(start_time) <= '{seq_date}'
and to_date(end_time) >= '{seq_date}'
group by appoint_stronger
;") %>%
  cat(sep = "\n\n") # 输出大屏幕,在结尾换行,之后再换行另起一行
## insert overwrite table rpt.rpt_collection_appoint_stronger_in_daily partition (dt = '2018-06-11')
## select appoint_stronger, count(case_id) as case_num
## from edw.collection_case_strength_h
## where to_date(start_time) <= '2018-06-11'
## and to_date(end_time) >= '2018-06-11'
## group by appoint_stronger
## ;
## 
## insert overwrite table rpt.rpt_collection_appoint_stronger_in_daily partition (dt = '2018-06-12')
## select appoint_stronger, count(case_id) as case_num
## from edw.collection_case_strength_h
## where to_date(start_time) <= '2018-06-12'
## and to_date(end_time) >= '2018-06-12'
## group by appoint_stronger
## ;
## 
## insert overwrite table rpt.rpt_collection_appoint_stronger_in_daily partition (dt = '2018-06-13')
## select appoint_stronger, count(case_id) as case_num
## from edw.collection_case_strength_h
## where to_date(start_time) <= '2018-06-13'
## and to_date(end_time) >= '2018-06-13'
## group by appoint_stronger
## ;

补充示例2

library(magrittr) # 使用 %>% 这个 pipeline 
library(glue)     # 字符段落处理

seq.Date(from = as.Date("2018-05-24"), 
         to = as.Date("2018-06-02"), 
         by = 1
         ) %>%
  as.character() -> 
  seq_date

# glue 支持在行尾使用\\双反斜杠来断行,而不会造成原字符串换行
# 在代码书写尽可能避免水平滚动条的出现是基本原则,该该功能非常实用
glue("
alter table \\
rpt.rpt_collection_ccms_oacase_list \\
drop if exists partition \\
(dt = '{seq_date}');
")
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-24');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-25');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-26');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-27');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-28');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-29');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-30');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-05-31');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-06-01');
## alter table rpt.rpt_collection_ccms_oacase_list drop if exists partition (dt = '2018-06-02');

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

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

相关文章

JavaScript高级之ECMASript 7、8 、9 、10 新特性

第3章 ECMASript 7 新特性 3.1. Array.prototype.includes Includes 方法用来检测数组中是否包含某个元素&#xff0c;返回布尔类型值 3.2. 指数操作符 在ES7中引入指数运算符「 **」&#xff0c;用来实现幂运算&#xff0c;功能与 Math.pow结果相同 第4章 ECMASript 8 新特…

swagger core 和 swagger ui 如何关联【窥探】

几个片段&#xff1a; package io.swagger.jaxrs.listing;import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils;import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.ws.rs.GET; import javax.ws.r…

vb 根据pid获取句柄_C++中避免返回指向对象内部的句柄(handles)

点蓝色字关注“CurryCoder的程序人生”微信公众号&#xff1a;CurryCoder的程序人生欢迎关注我&#xff0c;一起学习&#xff0c;一起进步!1.问题的引入假如你正在给一个应用写一个矩形类&#xff0c;这个矩形由左上角和右下角的顶点坐标表示。为了表示这两个点&#xff0c;我们…

关于MapReduce中自定义Combine类(一)

MRJobConfigpublic static fina COMBINE_CLASS_ATTR属性COMBINE_CLASS_ATTR "mapreduce.job.combine.class"————子接口&#xff08;F4&#xff09; JobContent方法getCombinerClass————子实现类 JobContextImpl实现getCombinerClass方法&#xff1a;public C…

react脚手架配置代理解决跨域问题

一、问题描述&#xff1a; 控制台报错&#xff0c;出现跨域问题 二、解决方案 配置代理&#xff1a; 第一种配置方式&#xff1a; 在package.json中追加如下配置 "proxy":"http://localhost:5000"说明&#xff1a; 优点&#xff1a;配置简单&#xff…

kstools工具是什么牌子_2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车...

2020年平衡车推荐&#xff0c;电动平衡车哪个牌子好&#xff1f;老司机教你如何选购电动平衡车随着我国科技的发展&#xff0c;生活水平的提高&#xff0c;在很多地方都出现了电动平衡车的身影&#xff0c;人们将电动平衡车当做短距离代步的工具&#xff0c;也是非常实用的。很…

plsql 中的一些好的设置和快捷键总结

1、SQL语句字符全部大写 自认为这是个好习惯&#xff0c;信息系统的核心是数据库&#xff0c;系统出问题时最先要查的就是SQL语句&#xff0c;怎样在浩瀚的日志中快速找到那条SQL语句是件比较痛苦的事情。 SQL语句全部大写并不能彻底解决这一问题&#xff0c;但在一堆代码…

react父子组件通信案例

父组件&#xff1a;App组件 子组件&#xff1a;Search组件、List组件 案例需求&#xff1a;文本框中输入关键词&#xff0c;点击搜索按钮后&#xff0c;下方列表展示出搜索结果 实现思路&#xff1a; 子组件Search组件向父组件App传递状态&#xff08;状态包括&#xff1a;是否…

matlab画线不同颜色_怎样画线框图才有意义

我们常轻忽身边习以为常的事物&#xff0c;觉得没有必要为一些看似简单又可有可无的东西浪费时间——例如线框图。虽然没必要凡事都寻根问底&#xff0c;但当面对复杂问题时&#xff0c;脚踏实地回归基本面也许才是根本解法。本文章深入介绍程序开发界面设计中&#xff0c;最简…

react 消息订阅-发布机制(解决兄弟组件通信问题)

消息订阅-发布机制 工具库: PubSubJS下载: npm install pubsub-js --save使用: 1)import PubSub from ‘pubsub-js’ //引入 2)PubSub.subscribe(‘delete’, function(data){ }); //订阅 3)PubSub.publish(‘delete’, data) //发布消息 App组件&#xff1a; import React,…

运行Myeclipse发生这事这是怎么回事,大神们

转载于:https://www.cnblogs.com/zhuh102/p/5753616.html

非零返回怎么解决_VLOOKUP如何返回多个值?

今天我来谈谈大家最熟悉的函数&#xff0c;也是使用频率最高的函数&#xff0c;基本是每天都在使用-VLOOKUP大家都知道VLOOKUP可以根据条件&#xff0c;查找并返回满足条件对应列的值&#xff0c;但是他的设定只是只能返回第一个满足条件的值如果我们要返回满足条件的多个值&am…

Fetch发送网络请求

1. 文档 https://github.github.io/fetch/https://segmentfault.com/a/1190000003810652 2. 特点 fetch: 原生函数&#xff0c;不再使用XmlHttpRequest对象提交ajax请求老版本浏览器可能不支持 3. 相关API GET请求 fetch(url).then(function(response) {return response.…

JSX详解React的事件绑定事件参数的传递

一、认识JSX 这段element变量的声明右侧赋值的标签语法是什么呢&#xff1f; 它不是一段字符串&#xff08;因为没有使用引号包裹&#xff09;&#xff0c;它看起来是一段HTML原生&#xff0c;但是我们能在js中直接给一个变量赋值html吗&#xff1f;其实是不可以的&#xff0c…

总谐波失真计算公式_新能源汽车技术|车用轮毂电机转矩谐波协同控制策略

点击 电机与控制应用 关注我们轮毂电机因结构简单、驱动灵活的特点广泛应用于轻型电动车辆。电机运行中存在的齿槽效应、逆变器非线性效应及电流谐波等问题&#xff0c;导致电机电磁转矩波动&#xff0c;影响车辆运行的平顺性。通过电磁转矩谐波分析发现其主要成分为低阶谐波。…

React条件渲染列表渲染

一、React条件渲染 某些情况下&#xff0c;界面的内容会根据不同的情况显示不同的内容&#xff0c;或者决定是否渲染某部分内容&#xff1a; 在vue中&#xff0c;我们会通过指令来控制&#xff1a;比如v-if、v-show&#xff1b;在React中&#xff0c;所有的条件判断都和普通的J…

解决VirtualBox错误:“FATAL:No bootable medium found!”

VirtualBox错误&#xff1a;“FATAL&#xff1a;No bootable medium found!”  用VirtualBox安装系统出现这个错误的几率极高&#xff0c;因为当哥出现同样问题的时候股沟了下”FATAL&#xff1a;No bootable medium found!“出现很多内容&#xff0c;但没一个把问题解决了的…

React事件总线

通过Context主要实现的是数据的共享&#xff0c;但是在开发中如果有跨组件之间的事件传递&#xff0c;应该如何操作呢&#xff1f; 一、安装events 在Vue中我们可以通过Vue的实例&#xff0c;快速实现一个事件总线&#xff08;EventBus&#xff09;&#xff0c;来完成操作&…

React中使用ref

一、如何使用ref 在React的开发模式中&#xff0c;通常情况下不需要、也不建议直接操作DOM原生&#xff0c;但是某些特殊的情况&#xff0c;确实需要获取到DOM进行某些操作&#xff1a; 管理焦点&#xff0c;文本选择或媒体播放&#xff1b;触发强制动画&#xff1b;集成第三方…

React中的受控组件和非受控组件

一、认识受控组件 在React中&#xff0c;HTML表单的处理方式和普通的DOM元素不太一样&#xff1a;表单元素通常会保存在一些内部的state。 比如下面的HTML表单元素&#xff1a; 这个处理方式是DOM默认处理HTML表单的行为&#xff0c;在用户点击提交时会提交到某个服务器中&…