我有两个表,我必须用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
谢谢您的帮助!
答案 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)