2015-05-22 1 views
-1

Мне просто требуется Требуемый вывод, как я написал ниже. Этот вопрос задал в интервью.Как получить менеджер, выпуск пары сотрудников?

Структура таблицы:

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') 

Таблица:

Table

Согласно таблице, мы должны организовать работника к своему менеджеру
M = менеджер E = Сотрудник
Примечание: ** Непосредственные роли Emp ниже ролей менеджера - их сотрудники
** Пример: А менеджер B, C и D является менеджером E, F

Требуемая мощность:

Output

позволяет видеть, кто собирается ответить!

+1

Что означает требуемый выход? Вам нужно определить вопрос больше. –

+1

Посмотрите на рисунок выхода, как заявил @Walker ..., пожалуйста, определите свой вопрос лучше –

+0

Подсказка: что означает «m» и «e»? а затем посмотреть на шаблон соответствующих пар. –

ответ

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 
3

Это умный вопрос, и я не думаю, что видел его раньше. Гош, вам действительно нужно подумать о том, что такое шаблон, который создает выход.

Для тех, кто этого не видит, значение «М» переходит в первый столбец для соответствующих значений «Е» перед следующим «М». Это было бы проще выразить в 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 Fiddle - here.

Примечание для интервьюеров: Если вы используете этот вопрос, просто измените базу данных на SQL Server 2012+. Есть более элегантные решения с функциональностью, предоставляемой в этой системе.

EDIT:

Это на самом деле версия, которую я хотел написать:

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'; 
+0

Я согласен ... это умный вопрос. очевидно, интервьюер хотел увидеть, как много пользователей SQL и как пользователь «справится» с проблемой. У меня был подобный вопрос в интервью, но я включил «CROSS JOIN» –