我有两张桌子:
Employee
:
员工 | 电话号码 | 开始日期 | 结束日期 | 部门 | 部门名称 |
---|---|---|---|---|---|
50 | 5478765 | 23 年 1 月 12 日 | 2023 年 1 月 29 日 | 5 | 物理 |
50 | 8756544 | 23 年 1 月 29 日 | 9999 年 12 月 31 日 | 6 | 化学 |
EmployeeSalary
:
员工 | 薪资 | 开始日期 | 结束日期 | 部门 |
---|---|---|---|---|
50 | 5000000 | 23 年 1 月 12 日 | 9999 年 12 月 31 日 | 6 |
我想加入这两个表,从
EmployeeSalary
表中我需要工资信息,而从Employee
表中,我需要最后一个电话号码,即在23年1月12日和29日期间输入的电话号码Jan-2023 电话号码 --> 5478765 和当前部门名称。
我正在连接这两个表并使用
LAG
函数提取以前的电话号码。但是,当使用 EmployeeID
和 DepartmentNumber
连接时,它不会显示以前的电话号码。
我需要这样的输出:
员工 | 薪资 | 开始日期 | 结束日期 | 部门 | 电话号码 | 部门名称 |
---|---|---|---|---|---|---|
50 | 5000000 | 23 年 1 月 12 日 | 9999 年 12 月 31 日 | 5 | 5478765 | 化学 |
SELECT es.Employee,
Salary,
es.StartDate,
es.EndDate,
prevDept,
prevPhone,
DeptName
FROM EmployeeSalary AS es
INNER JOIN
(
SELECT Employee,
Dept,
DeptName,
LAG(PhoneNum) OVER (PARTITION BY Employee ORDER BY StartDate) prevPhone,
LAG(Dept) OVER (PARTITION BY Employee ORDER BY StartDate) prevDept
FROM employee
) AS e
ON e.Employee = es.Employee
AND e.Dept = es.Dept;
员工 | 薪资 | 开始日期 | 结束日期 | 上一个部门 | 上一篇电话 | 部门名称 |
---|---|---|---|---|---|---|
50 | 5000000 | 2023-01-12 | 9999-12-31 | 5 | 5478765 | 化学 |
如果员工拥有两个以上角色,这只是另一种选择。
示例
Select E.Employee
,S.Salary
,StartDate = E.D1
,EndDate = E.D2
,E.Dept
,E.DeptName
,E.[Phone Num]
From (
Select *
,D1 = min(StartDate) over (partition by Employee)
,D2 = max(EndDate) over (partition by Employee)
,RN = row_number() over(partition by Employee order by EndDate desc)
from Employee
) E
Join EmployeeSalary S on E.Employee=S.Employee
and E.EndDate=S.EndDate
and E.RN=1
结果
Employee Salary StartDate EndDate Dept DeptName Phone Num
50 5000000 2023-01-12 9999-12-31 6 Chemistry 8756544