探究分析---利用sql批量更新部分时间的同比数据
问题:如何将social_kol_tmp表 中的字段cost_YA中日期为201901-201909中的值替换为相同brand和pltform对应18年月份的col_cost字段的数据,其他日期的cost_YA值不变?
假设:social_kol_tmp表 A,social_kol_tmp表B
难点:可以利用join on brand和pltform相等,但是日期如何匹配呢?
思路:通过对18年各月和对应19年的各个月份产生相应的字段,rn1和rn2
注意,理论上结果中同一行两个时间只相差一年
方案一:窗口函数生成rn1和rn2(结果需要看数据情况,原因如下)
1. 代码如下:
select a.brand,a.platform,a.period as Adt,b.period as Bdt,a.col_cost,b.col_cost as cost_YNew
from (select col_cost,brand,platform,period,dense_rank() over (partition by brand,platform order by period) as rn1
from social_kol_tmp
where period>='201901' and period<'201909'
) a
join
( select col_cost,brand,platform,period,dense_rank() over (partition by brand,platform order by period ) as rn2
from social_kol_tmp
where period>='201801' and period<'201809'
) b
on a.rn1=b.rn2 and a.brand=b.brand and a.platform=b.platform
2. 出现的问题:部分时间不对应
注意,理论上结果中同一行两个时间只相差一年
3 .原因分析:
某个品牌的某一平台的数据不是每个月都有,排序产生的字段rn1和rn2出了问题,未按照对应的月份排序。
方案二:case when 生成rn1和rn2(成功)
1. 代码如下:
select a.brand,a.platform,a.period as Adt,b.period as Bdt,a.col_cost,b.col_cost as cost_YNew
from (select col_cost,brand,platform,period,
case when period='201901' then '1'
when period='201902' then '2'
when period='201903' then '3'
when period='201904' then '4'
when period='201905' then '5'
else period
end as rn1
from social_kol_tmp
where period>='201901' and period<'201909'
) a
join
( select col_cost,brand,platform,period,
case when period='201801' then '1'
when period='201802' then '2'
when period='201803' then '3'
when period='201804' then '4'
when period='201805' then '5'
else period
end as rn2
from social_kol_tmp
where period>='201801' and period<'201809'
) b
on a.rn1=b.rn2 and a.brand=b.brand and a.platform=b.platform
2.结果如下:
检验:
- Adt和Bdt的日期月份是对应的
- 表中的数据Adt对应的col_cost是以1开头的,Bd对应的是以2开头的,故数据校验成功
在sql中实现数据更新的方法
参考如下(sqlsever):
1.创建一个表,sMedia.social_kol_tmp_new :201901-201909中的kol_cost替换为对应18年月份的数据
Create table sMedia.social_kol_tmp_new as
select a.brand,a.platform,a.period as Adt,b.period as Bdt,a.kol_cost,b.kol_cost as cost_YNew
from (select kol_cost,brand,platform,period,
case when period='201901' then '1'
when period='201902' then '2'
when period='201903' then '3'
when period='201904' then '4'
when period='201905' then '5'
when period='201906' then '3'
when period='201907' then '4'
when period='201908' then '5'
when period='201909' then '5'
else period
end as rn1
from Media.social_kol_tmp_new
where period>='201901' and period<'201909'
) a
join
( select kol_cost,brand,platform,period,
case when period='201801' then '1'
when period='201802' then '2'
when period='201803' then '3'
when period='201804' then '4'
when period='201805' then '5'
when period='201806' then '6'
when period='201807' then '7'
when period='201808' then '8'
when period='201809' then '9'
else period
end as rn2
from Media.social_kol_tmp_new
where period>='201801' and period<'201809'
) b
on a.rn1=b.rn2 and a.brand=b.brand and a.platform=b.platform
2.在sMedia.social_kol_tmp 更新新数据
update sMedia.social_kol_tmp
set cost_YA= cost_YNew
from sMedia.social_kol_tmp a,Media.social_kol_tmp_new b
where a.period=b.Adt
探究分析---利用sql批量更新部分时间的同比数据的更多相关文章
- SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
--SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...
- SqlServer 利用游标批量更新数据
SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...
- 利用sql批量删除表,存储过程
利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...
- SQL批量更新数据
SQL批量更新数据 step1:导入Excel数据, 具体见百度.注意点:一列中含有float型数据和文本数据的时候,导入要将Excel中的表格属性改成文本,或在数字项目前加个单引号. step2 ...
- oracle 批量更新之将一个表的数据批量更新至另一个表
oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...
- Oracle两张表关联批量更新其中一张表的数据
Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...
- sql 批量更新
利用update和select进行批量更新 UPDATE Table1 SET categoryId =(SELECT Id FROM Table2 WHERE Table1 .Id=Table2.c ...
- 利用pip批量更新python库
如果python库比较旧,需要更新到最新版本,可以利用pip工具. DOS命令行下,输入pip -V查看pip版本,可以先把pip更新到新版本. 查看系统里过期的python库 pip list #列 ...
- SQL批量更新 关系表更新
很多人在做数据的批量更新时..如果更新的内容是从其他表查出来的..很容易这么写.. UPDATE TABLE1 SET COLUMN1=(SELECT SUM(SOMETHING) FROM TABL ...
随机推荐
- Vysor
官网:http://www.vysor.io/ Vysor用 PC远程控制投影安卓手机/平板工具 Vysor 是一个免费的google浏览器插件. 它可以让你在pc上控制你的Android手机.平板等 ...
- Python字符串内置方法使用及年龄游戏深入探究
目录 作业 ==程序代码自上往下运行,建议自上而下的完成下列任务== 作业 使用代码实现以下业务逻辑: 写代码,有如下变量name = " aleX",请按照要求实现每个功能: 移 ...
- Centos的启动流程学习
Centos 6 的启动流程: POST ---> Boot sequence(BOIS) ---> Boot loader (MBR) ---> kernel(ramdiskfs ...
- pytroch 权重初始化和加载词向量的方法
1.几种不同的初始化方法 import torch.nn as nn embedding = torch.Tensor(3, 5) #如下6种初始化方法 #正态分布 nn.init.normal_(e ...
- mybatis中<include>标签的作用
MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段 sql标签中id属性对应include标签中的refid属性.通过include标签将sql片段和原sql片段进行 ...
- 用scratch写了一个win98 界面模拟
scratch模拟win98 玩耍,放在网上了https://kada.163.com/project/4216461-3515165.htm
- vue+Element 表格中的树形数据
template部分 只在树形的结构中显示编辑与删除按钮 这里我只是简单的做了一个 v-if 判断在操作列中 ,判断是否存在级别这个字段 <div> <el-table :dat ...
- 剑指offer:数据流中的中位数(小顶堆+大顶堆)
1. 题目描述 /** 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值. 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...
- D3力布图绘制--节点跑掉,单曲线弯曲问题记录
D3力布图绘制中遇到的交互问题,频繁操作数据后,会出现节点跑掉和单曲线弯曲的问题 问题描述 在id指向都正常的情况下出现以下2种状况: 单曲线弯曲 节点跑掉 经排查,是数据重复导致的问题 线条也是一样 ...
- 不常用但是又得有的一个标签——音频(audio)
这几天做一个项目里面出现了H5的一个标签,音频(audio),可以说这是我第一次遇见这种标签基本上很少用的,也许是我做的项目少吧, 下面我来说一下我的思路,当然这是我自己想的,当时我想到的是如何让一个 ...