Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь в написании запроса  [new]
assmsk
Member

Откуда:
Сообщений: 169
Добрый день.
Есть таблица с id сотрудника и его навыками(скиллами).
Нужно написать запрос который по каждому сотруднику выводит кол-во других сотрудников у которых есть такие же навыки как у него.

create table #x ( id_user int , skill varchar(255) )
Insert #x
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c' union all
select 3,'x' union all
select 4,'a' union all
select 4,'b' union all
select 4,'c' union all
select 4,'h' union all
select 5,'h'



Результат :
1 - 2
2 - 2
3 - 0
4 - 0
5 - 1

т.е
у сотрудника с id 1 скиллы a,b,с , такие скиллы есть у сотрудников 2 и 4 = 2
у сотрудника с id 2 скиллы a,b,с , такие скиллы есть у сотрудников 1 и 4 = 2
у сотрудника с id 3 скилл х , такого скилла ни у кого нет = 0
у сотрудника с id 4 скиллы a,b,с,h , такого набора ни у кого нет = 0
у сотрудника с id 5 скилл h , такой есть у сотрудника 4 = 1


Вроде бы должно быть не сложно, но что то я запутался как написать
31 июл 18, 10:39    [21616947]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20190
Объедини 2 копии таблицы по user1<>user2 и skill1=skill2. Сгруппируй по (user1,user2), посчитай количество записей count12 для пары. Отдельно посчитай количество count1 скиллов user1. Оставь только те пары, где count1=count12. Сгруппируй по user1 и посчитай count. Всё.
31 июл 18, 10:45    [21616970]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
declare @x table ( id_user int , skill varchar(255) )
 Insert @x
 select 1,'a' union all
 select 1,'b' union all
 select 1,'c' union all
 select 2,'a' union all
 select 2,'b' union all
 select 2,'c' union all
 select 3,'x' union all
 select 4,'a' union all
 select 4,'b' union all
 select 4,'c' union all
 select 4,'h' union all
 select 5,'h';

With cte as (
Select a.id_user, a.skill, b.id_user as Other_User
From  @x a
left join @x b on a.id_user <> b.id_user and a.skill = b.skill)

Select users.id_user,count(others.Other_User)
 From (Select id_user, count(distinct skill) as Skills From cte Group by id_user) users
 left join (Select id_user, Other_User, count(distinct skill) as Skills From cte Group by id_user, Other_User) others 
   on users.id_user = Others.id_user and users.Skills = Others.Skills
 Group by users.id_user
31 июл 18, 11:00    [21617023]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
assmsk,

реляционное деление.
31 июл 18, 11:02    [21617038]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Для ускорения можно, по результату идентично:
declare @x table ( id_user int , skill varchar(255) )
 Insert @x
 select 1,'a' union all
 select 1,'b' union all
 select 1,'c' union all
 select 2,'a' union all
 select 2,'b' union all
 select 2,'c' union all
 select 3,'x' union all
 select 4,'a' union all
 select 4,'b' union all
 select 4,'c' union all
 select 4,'h' union all
 select 5,'h';

With cte as (
Select a.id_user, a.skill, b.id_user as Other_User
From  @x a
left join @x b on a.id_user <> b.id_user and a.skill = b.skill)

Select users.id_user,count(others.Other_User)
 From (Select id_user, count(distinct skill) as Skills From @x Group by id_user) users
 left join (Select id_user, Other_User, count(distinct skill) as Skills From cte Group by id_user, Other_User) others 
   on users.id_user = Others.id_user and users.Skills = Others.Skills
 Group by users.id_user


Данный запрос будет корректно работать даже при повторах навыков по юзеру.
31 июл 18, 11:04    [21617045]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Naomin papa
Member

Откуда:
Сообщений: 5
Щукина Анна
assmsk,

реляционное деление.

Я бы даже сказал выделение
7 авг 18, 20:48    [21633474]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить