我有下表:
id u_Id Ref c_type
1 1 ref1 c
2 1 ref2 c
3 1 ref3 m
我需要做的是对于同一个uid(在这种情况下为1),其中group_id为c,得到group_id为m的相应行。因此,对于id 1和2列,我需要从id为3的行获取ref。
我试过这个并且似乎有效但我想知道是否还有其他更短的版本:
Declare @temp table (id int, u_id int, ref varchar(10), c_type varchar(1))
insert into @temp
select 1, 1, 'ref1', 'c' union all
select 2, 1, 'ref2', 'c' union all
select 3, 1, 'ref3', 'm'
;with b as
(
select * from @temp
where c_type = 'c'
),
x as
(
select * from @temp
where c_type = 'm'
)
select distinct x.u_id,x.c_type,x.ref from b,x
where x.u_id = b.u_id
预期结果
id u_Id Ref c_type ref
1 1 ref1 c ref3
2 1 ref2 c ref3
答案 0 :(得分:1)
您可以使用窗口功能执行此操作:
select t.*,
max(case when c_type = 'm' then id end) over (partition by u_id) as m_id;
from @temp t;
如果您只想要ref
列:
select t.*,
max(case when c_type = 'm' then ref end) over (partition by u_id) as m_ref;
from @temp t;
如果您需要该行中的其他值,则可以在join
中输入:
select t.*, tm.*
from (select t.*,
max(case when c_type = 'm' then id end) over (partition by u_id) as m_id;
from @temp t
) t left join
@temp tm
on t.m_id = tm.id;