我有两个表,我必须用table1中的代码值填充来自table2的column。Date列的类型是datetime,来自table1的date列没有时间值,而来自table2的日期有时间。
Table1:
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:
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谢谢你的帮助!
发布于 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)
发布于 2018-12-16 23:11:55
这是相当棘手的。您需要枚举两个表中的匹配值,然后将该信息用于更新。
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;发布于 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
https://stackoverflow.com/questions/53807250
复制相似问题