从另一个表中更新一个列,其中datetime在另一个表中具有多个值

时间:2018-12-16 23:04:43

标签: sql sql-server tsql

我有两个表,我必须用table1中代码的值来填充table2中的Code列。 Date列的类型为datetime,其中table1的日期列没有时间值,而table2的日期确实有时间。

表1:

    Code  Date 
    NULL  2018-5-6 00:00:00
    NULL  2018-5-6 00:00:00
    NULL  2018-5-6 00:00:00
    NULL  2018-5-6 00:00:00
    NULL  2017-7-4 00:00:00
    NULL  2016-1-3 00:00:00

和表2:

    Code  Date 
    F444  2018-5-6 01:30:00
    T777  2018-5-6 07:00:00
    R545  2017-7-4 00:00:00
    D432  2016-1-3 00:00:00

当我尝试加入表并从table1更新代码时,我只能从table2中获得一个日期来填写代码。

结果:

Code  Date 
F444  2018-5-6 00:00:00
F444  2018-5-6 00:00:00
F444  2018-5-6 00:00:00
F444  2018-5-6 00:00:00
R545  2017-7-4 00:00:00
D432  2016-1-3 00:00:00

如果一个日期在另一表中多次出现,我如何更新代码列以显示所有代码?

预期结果:

   Code  Date 
F444  2018-5-6 00:00:00
F444  2018-5-6 00:00:00
T777  2018-5-6 00:00:00
T777  2018-5-6 00:00:00
R545  2017-7-4 00:00:00
D432  2016-1-3 00:00:00

谢谢您的帮助!

3 个答案:

答案 0 :(得分:1)

这很棘手。您需要枚举两个表中的匹配值,然后使用该信息进行更新。

with toupdate as (
      select t1.*,
             row_number() over (partition by date order by date) as seqnum
      from table1 t1
     )
update t
    set code = t2.code
    from toupdate t join
         (select t2.*,
                 row_number() over (partition by date order by date) as seqnum,
                 count(*) over (partition by date) as cnt
          from table2 t2
         ) t2
         on t.date = t2.date and
            t1.seqnum % t2.cnt = t2.seqnum;

答案 1 :(得分:0)

这是代码。

我们可以使用sql中的ntile函数平均分配值。

从(选择b.code,a.date 从t1处选择*,ntile(2)作为(按日期划分按日期排序)作为tt 左联接 (选择*,rank()(从(按convert(date,date)按日期划分))作为t2的ttr )b on convert(date,a。[date])= convert(date,b。[date])和a.tt = b.ttr

答案 2 :(得分:0)

用于更新-相同的概念,但将记录放入#temp以避免更新时出现性能问题。

逻辑关注

删除表#temp 选择b.code,a.date,ntile(2)作为(t。按a.date顺序按a.date进行分区)作为ttemp到#temp from(选择*,ntile(2)over(按日期按日期顺序进行按日期划分)从t1开始的tt)左连接(选择*,rank()在(按日期转换(日期,日期)的按日期划分)作为从t2开始的ttr)b在convert(date,a。[date])= convert(date, b。[date])和a.tt = b.ttr

更新一个 设置代码= b.code 从(选择*,ntile(2)到(按日期划分按日期排序)作为t1中的t1) 内部连接#temp b on(a.date = b.date和a.t1 = b.t1)