问题:如何将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 生成rn1rn2(成功)

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批量更新部分时间的同比数据的更多相关文章

  1. SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int

    --SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int --关键说明:--1.从系统表syscolumns中的查询所有xtype='48'的记录得到类型为[tinyint]的字段- ...

  2. SqlServer 利用游标批量更新数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...

  3. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  4. SQL批量更新数据

    SQL批量更新数据 step1:导入Excel数据, 具体见百度.注意点:一列中含有float型数据和文本数据的时候,导入要将Excel中的表格属性改成文本,或在数字项目前加个单引号.   step2 ...

  5. oracle 批量更新之将一个表的数据批量更新至另一个表

      oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...

  6. Oracle两张表关联批量更新其中一张表的数据

    Oracle两张表关联批量更新其中一张表的数据 方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXI ...

  7. sql 批量更新

    利用update和select进行批量更新 UPDATE Table1 SET categoryId =(SELECT Id FROM Table2 WHERE Table1 .Id=Table2.c ...

  8. 利用pip批量更新python库

    如果python库比较旧,需要更新到最新版本,可以利用pip工具. DOS命令行下,输入pip -V查看pip版本,可以先把pip更新到新版本. 查看系统里过期的python库 pip list #列 ...

  9. SQL批量更新 关系表更新

    很多人在做数据的批量更新时..如果更新的内容是从其他表查出来的..很容易这么写.. UPDATE TABLE1 SET COLUMN1=(SELECT SUM(SOMETHING) FROM TABL ...

随机推荐

  1. [Go] gocron源码阅读-判断是否使用root用户执行

    判断是linux系统,并且uid为0,allowRoot是通过命令行传参传进来的,通过flag包解析出来的,可以使用go run node.go -h看到这些参数 && !allowR ...

  2. requests---参数关联

    在做接口测试的过程中,我们经常会遇到参数关联,也就是我们经常所说的上一个接口返回是下一个接口的请求 参数关联 在应用业务接口中,完成一个业务功能时,有时候一个接口可能不满足业务的整个流程逻辑,需要多个 ...

  3. 多线程时,请求执行不是按顺序的,可添加Critical Section Controller(临界部分控制器),执行顺序是固定的,但执行一段时间后,该逻辑器下的请求不再循环,无解ing

  4. Anomaly Detection

    数据集中的异常数据通常被成为异常点.离群点或孤立点等,典型特征是这些数据的特征或规则与大多数数据不一致,呈现出“异常”的特点,而检测这些数据的方法被称为异常检测. 异常数据根据原始数据集的不同可以分为 ...

  5. SpringMVC详细流程(一)

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模 ...

  6. luoguP4069 [SDOI2016]游戏

    题意 显然书剖套李超树. 考虑怎么算函数值: 设\((x,y)\)的\(lca\)为\(z\),我们插一条斜率为\(k\),截距为\(b\)的线段. \((x,z)\)上的点\(u\): \(f(u) ...

  7. web 服务

    package main import ( "strings" "fmt" "net/http" "log" ) fun ...

  8. C#中List<T>转DataTable

      通过查询出来的类的集合的属性集合生成数据行,并通过属性获取每一个实体的指定属性的指定值

  9. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示

    编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...

  10. Expression Tree上手指南 (一)【转】

    大家可能都知道Expression Tree是.NET 3.5引入的新增功能.不少朋友们已经听说过这一特性,但还没来得及了解.看看博客园里的老赵等诸多牛人,将Expression Tree玩得眼花缭乱 ...