Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь в написании запроса / 6 сообщений из 6, страница 1 из 1
31.07.2018, 10:39
    #39681438
assmsk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
Добрый день.
Есть таблица с 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


Вроде бы должно быть не сложно, но что то я запутался как написать
...
Рейтинг: 0 / 0
31.07.2018, 10:45
    #39681444
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
Объедини 2 копии таблицы по user1<>user2 и skill1=skill2. Сгруппируй по (user1,user2), посчитай количество записей count12 для пары. Отдельно посчитай количество count1 скиллов user1. Оставь только те пары, где count1=count12. Сгруппируй по user1 и посчитай count. Всё.
...
Рейтинг: 0 / 0
31.07.2018, 11:00
    #39681453
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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
...
Рейтинг: 0 / 0
31.07.2018, 11:02
    #39681457
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
assmsk,

реляционное деление.
...
Рейтинг: 0 / 0
31.07.2018, 11:04
    #39681459
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
Для ускорения можно, по результату идентично:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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



Данный запрос будет корректно работать даже при повторах навыков по юзеру.
...
Рейтинг: 0 / 0
07.08.2018, 20:48
    #39684502
Naomin papa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь в написании запроса
Щукина Аннаassmsk,

реляционное деление.
Я бы даже сказал выделение
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь в написании запроса / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]