首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个表中更新一个列,其中datetime在另一个列中有多个值

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

Stack Overflow用户
提问于 2018-12-16 23:04:42
回答 3查看 209关注 0票数 0

我有两个表,我必须用table1中的代码值填充来自table2的column。Date列的类型是datetime,来自table1的date列没有时间值,而来自table2的日期有时间。

Table1:

代码语言:javascript
复制
    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

和Table2:

代码语言:javascript
复制
    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获得一个日期来填充代码。

结果:

代码语言:javascript
复制
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

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

预期结果:

代码语言:javascript
复制
   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

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-18 03:31:23

对于更新--相同的无标记概念,但在更新时将记录输入到#temp,以避免性能问题。

逻辑-跟随

将表#temp选择b.code、a.date、ntile(2) over ( a.date order by a.date)作为t1,到#temp从(选择*、ntile(2) over (按日期顺序划分)以tt从t1 )从t1中删除一个左连接(选择*、排名() over (按转换顺序(日期、日期)顺序)和ttr ( t2 )b )(日期,a.date)=转换(日期,b.date)和a.tt=b.ttr。

将一个集合code=b.code从(select *,ntile(2) over (按日期按日期顺序划分)更新为t1 (按日期排序)从t1)更新为内部连接#temp (a.date=b.date和a.t1=b.t1)

票数 0
EN

Stack Overflow用户

发布于 2018-12-16 23:11:55

这是相当棘手的。您需要枚举两个表中的匹配值,然后将该信息用于更新。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-12-17 08:52:28

这是密码。

我们同样可以使用sql中的ntile函数来分配值。

选择b.code,a.date从(选择*,a.date(2) over (按日期顺序划分)作为tt从t1 )左连接(选择*,排名() over (按日期划分(日期,日期)顺序按日期)作为ttr从t2 )b (日期,a.date)=转换(日期,b.date)和a.tt=b.ttr

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53807250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档