我只需要下面发布的必需输出。这个问题在接受采访时提出。
表格结构:
create table #test
(
id int,
emp char,
roles char
)
insert into #test values(1,'A','M')
insert into #test values(2,'B','E')
insert into #test values(3,'C','E')
insert into #test values(4,'D','M')
insert into #test values(5,'E','E')
insert into #test values(6,'F','E')
insert into #test values(7,'G','M')
insert into #test values(8,'H','E')
insert into #test values(9,'I','E')
insert into #test values(10,'J','E')
表:
根据表格,我们已将员工安排到他的经理上
M =经理
E =雇员
注意:**经理角色下面的直接Emp角色是他们的员工
**例如:A是B的经理,C和D是E,F的经理
要求的输出:
让我们看看谁会回答!
答案 0 :(得分:3)
这是一个聪明的问题,我不认为我以前见过它。天哪,你实际上必须考虑创造输出的模式是什么。
对于那些看不到它的人来说," M"值在相应的" E"的第一列中。在下一个" M"之前的值。这在SQL Server 2012+中更容易表达,但这是SQL Server 2005中的一种方法:
我很确定这是不他们想到的方法:
select tlm.emp, t.emp
from test t cross apply
(select max(t2.id) as LastMId
from test t2
where t2.id <= t.id and t2.roles = 'M'
) tm join
test tlm
on tm.LastMId = tlm.id
where t.roles = 'E';
SQL小提琴是here。
采访者注意:如果您使用此问题,只需将数据库更改为SQL Server 2012+即可。有更多优雅的解决方案,该系统提供的功能。
编辑:
这实际上是我想写的版本:
select tm.emp, t.emp
from test t cross apply
(select top 1 t2.emp
from test t2
where t2.id <= t.id and t2.roles = 'M'
order by t2.id desc
) tm
where t.roles = 'E';
答案 1 :(得分:2)
对于任何SQL Server版本,还有一种方法:
select t1.emp, t2.emp
from
(
select id,
case
when t.roles = 'E' then (select emp from #test where id = (select max(id) from #test where id < t.id and roles = 'M'))
end as emp
from #test t) t1
join
#test t2 on t1.Id = t2.Id
where t1.emp is not null