У меня есть следующая таблица:
Стол:
create table emp_project_mapping
(
emp_id varchar(10),
pro_id varchar(10)
)
Записи:
insert into emp_project_mapping values('E101','P1'),
('E101','P2'),
('E102','P1'),
('E103','P3'),
('E104','P3'),
('E105','P4');
Запрос 1: Найдите сотрудника, который работает более чем над одним проектом.
Ожидаемый результат:
emp_id pro_id
--------------
E101 P1
E101 P2
Запрос 2: Найдите нескольких сотрудников, работающих над одним проектом.
emp_id pro_id
--------------
E103 P3
E104 P3
E101 P1
E102 P1
Пытаться:
Запрос 1:
;WITH CTE
AS
(
SELECT emp_id,
pro_id,
DENSE_RANK() over(order by emp_id) empid_rank,
DENSE_RANK() over(order by pro_id) proid_rank
FROM emp_project_mapping
)
SELECT emp_id,pro_id
FROM CTE
WHERE empid_rank = 1 and proid_rank>1
Выход:
emp_id pro_id
---------------
E101 P2
Запрос 2:
;WITH CTE
AS
(
SELECT emp_id,
pro_id,
DENSE_RANK() over(order by emp_id) empid_rank,
DENSE_RANK() over(order by pro_id) proid_rank
FROM emp_project_mapping
)
SELECT emp_id,pro_id
FROM CTE
WHERE empid_rank > 1 and proid_rank = 1
Выход:
emp_id pro_id
----------------
E102 P1
Вы можете попробовать это ....
Для первого решения
;WITH CTE
AS
(
SELECT emp_id,
pro_id,
ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY pro_id) empid_rank
FROM emp_project_mapping
)
SELECT * from emp_project_mapping WHERE emp_id IN (SELECT emp_id
FROM CTE
WHERE empid_rank > 1 )
Для второго решения
;WITH CTE
AS
(
SELECT emp_id,
pro_id,
ROW_NUMBER() OVER (PARTITION BY pro_id ORDER BY emp_id) proid_rank
FROM emp_project_mapping
)
SELECT * FROM emp_project_mapping WHERE pro_id IN (SELECT pro_id
FROM CTE
WHERE proid_rank>1)
@Mahesh: спасибо за ваше предложение, я обновил свой запрос, пожалуйста, проверьте сейчас.
Для идентификации сотрудника, работающего более чем над одним проектом, текущее решение может не сработать. Как и в случае с плотным рангом, вы получите ранг №1 только для одного сотрудника, например, E105, если он также работает над проектом P3, тогда ваше решение может не сработать... )>1