When we have a scenario to pick up first and last record/hierarchy from a table which maintains history of changes(EmployeeHistory_Table).
Hierarchy_Table
role hierarchies |
Trainee_System_Engineer |
System_Engineer |
Senior_Software_Eng |
Team_Leader |
Manager |
Senior_Exec |
EmployeeHistory_Table
emp_name | current_role | new_role |
Dan | Trainee_System_Engineer | System_Engineer |
Dan | System_Engineer | Senior_Software_Eng |
Dan | Senior_Software_Eng | Manager |
Tom | System_Engineer | Senior_Software_Eng |
Tom | Senior_Software_Eng | Team_Leader |
Jack | System_Engineer | Team_Leader |
Jack | Team_Leader | Manager |
Jack | Manager | Senior_Exec |
expected output:
emp_name | started_role | current_role |
Jack | System_Engineer | Trainee_System_Engineer |
Tom | System_Engineer | Team_Leader |
Dan | Trainee_System_Engineer | Manager |
below is the sql for this kind of scenario:
CREATE TABLE #emp_RoleChanges (
emp_name VARCHAR(30),
current_role VARCHAR(30) ,
new_role VARCHAR(30)
);
INSERT INTO #emp_RoleChanges (emp_name , current_role , new_role )
VALUES
(‘Dan’, ‘Trainee_System_Engineer’, ‘System_Engineer’),
(‘Dan’, ‘System_Engineer’, ‘Senior_Software_Eng’),
(‘Dan’, ‘Senior_Software_Eng’, ‘Manager’),
(‘Tom’, ‘System_Engineer’, ‘Senior_Software_Eng’),
(‘Tom’, ‘Senior_Software_Eng’, ‘Team_Leader’),
(‘Jack’, ‘System_Engineer’, ‘Team_Leader’),
(‘Jack’, ‘Team_Leader’, ‘Manager’),
(‘Jack’, ‘Manager’, ‘Trainee_System_Engineer’)
;
select * from #emp_RoleChanges
;
WITH q AS (
SELECT 1 AS LEVEL, emp_name , current_role , new_role
FROM #emp_RoleChanges
UNION ALL
SELECT LEVEL + 1, q.emp_name, q.current_role, u.new_role
FROM q
INNER JOIN #emp_RoleChanges u ON u.current_role = q.new_role and u.emp_name = q.emp_name
)
–select * from q
–order by 2,1
SELECT –q.LEVEL,
q.emp_name , q.current_role started_role, q.new_role current_role
FROM q
where q.level = (select max(p.level) from q p where p.emp_name = q.emp_name)