-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathPrimaryDepartmentOfEmployee.sql
78 lines (69 loc) · 2.8 KB
/
PrimaryDepartmentOfEmployee.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
-- Table: Employee
-- +---------------+---------+
-- | Column Name | Type |
-- +---------------+---------+
-- | employee_id | int |
-- | department_id | int |
-- | primary_flag | varchar |
-- +---------------+---------+
-- (employee_id, department_id) is the primary key (combination of columns with unique values) for this table.
-- employee_id is the id of the employee.
-- department_id is the id of the department to which the employee belongs.
-- primary_flag is an ENUM (category) of type ('Y', 'N'). If the flag is 'Y', the department is the primary department for the employee.
-- If the flag is 'N', the department is not the primary.
-- Employees can belong to multiple departments. When the employee joins other departments, they need to decide which department
-- is their primary department. Note that when an employee belongs to only one department, their primary column is 'N'.
-- Write a solution to report all the employees with their primary department. For employees who belong to one department,
-- report their only department.
-- Return the result table in any order.
-- The result format is in the following example.
-- Example 1:
-- Input:
-- Employee table:
-- +-------------+---------------+--------------+
-- | employee_id | department_id | primary_flag |
-- +-------------+---------------+--------------+
-- | 1 | 1 | N |
-- | 2 | 1 | Y |
-- | 2 | 2 | N |
-- | 3 | 3 | N |
-- | 4 | 2 | N |
-- | 4 | 3 | Y |
-- | 4 | 4 | N |
-- +-------------+---------------+--------------+
-- Output:
-- +-------------+---------------+
-- | employee_id | department_id |
-- +-------------+---------------+
-- | 1 | 1 |
-- | 2 | 1 |
-- | 3 | 3 |
-- | 4 | 3 |
-- +-------------+---------------+
-- Explanation:
-- - The Primary department for employee 1 is 1.
-- - The Primary department for employee 2 is 1.
-- - The Primary department for employee 3 is 3.
-- - The Primary department for employee 4 is 3.
-- Write your PostgreSQL query statement below
-- Solution
with residue_compute as
(
select Employee.employee_id,
Employee.department_id
from Employee inner join (
select * from
(
select employee_id,
count(department_id) as departments_cnt
from Employee group by employee_id
) where departments_cnt = 1
) temp on Employee.employee_id = temp.employee_id
)
select employee_id,
department_id
from Employee where primary_flag = 'Y'
UNION
(select employee_id,
department_id
from residue_compute);