来了来了,想到一个可能比较麻烦的方法,如果后面想到更简便的再更新,步骤如下:
一、找出原始表符合条件的记录
找出同一SUBJECT_ID、ITEM_ID下,B_TIME距离A_TIME最近的记录(并且A_TIME大于B__TIME),可以分为两步;
第一先找出符合条件的b_time,也就是在满足A_TIME大于B__TIME条件下找出最大的b_time,代码结果如下:
select subject_id,item_id,max(b_time) maxtime #求得最大的b_time,给别名maxtimefrom 原始表 where a_time>b_time #筛选a_time>b_time的记录group by subject_id,item_id; #用subject_id和item_id做分组
第二步是将上一步查询的表和原始表做内连接,连接条件是subject_id、item_id、maxtime相等,这样就找出符合留存需求的记录了,代码和结果如下:
select 原始表.* from 原始表
join (select subject_id,item_id,max(b_time) maxtime
from 原始表 where a_time>b_time
group by subject_id,item_id) as a
on 原始表.subject_id=a.subject_id and 原始表.item_id=a.item_id and 原始表.b_time=a.maxtime;
二、和D_ITEMD表进行比对
和D_ITEMD表中的ITEMID进行比对,如果没有完全匹配,插入对应的subject_id和item_id,其他值填充null,同样分为两步:
第一步:因为有不同的subject_id,如果有多个subject_id没有某个值(例如E,需要插入多行E值),所以先将subject_id和D_ITEMD表中的ITEMID做排列组合,代码和结果如下:
select distinct subject_id,d_itemd.item_id
from d_itemd,原始表; #两个表笛卡尔积,同时去重复
第二步将上方得到的结果和第一阶段的结果进行左连接,连接条件是subject_id和item_id相等,没有对应结果的返回空值,代码和结果如下:
select c.subject_id,c.item_id,item_value,a_time,b_time,row_id
from
(select distinct subject_id,d_itemd.item_id
from d_itemd,原始表) as c #第二阶段第一步得到的表别名为c
left join
(select 原始表.* from 原始表
join (select subject_id,item_id,max(b_time) maxtime
from 原始表 where a_time>b_time
group by subject_id,item_id) as a
on 原始表.subject_id=a.subject_id and 原始表.item_id=a.item_id and 原始表.b_time=a.maxtime) as b
on c.item_id=b.item_id and c.subject_id=b.subject_id; #第一阶段第二部得到的表别名为b
如果想到其他好的办法在更新~~