提问人:VB IN 提问时间:11/10/2023 最后编辑:Dale KVB IN 更新时间:11/11/2023 访问量:40
LAG 函数在联接中使用时无法捕获以前的记录信息
LAG function unable to capture the previous record information when used in join
问:
我有两张表:
Employee
:
员工 | 电话号码 | 开始日期 | 结束日期 | 部门 | 部门名称 |
---|---|---|---|---|---|
50 | 5478765 | 12 1月23 | 29 1月2023 | 5 | 物理 |
50 | 8756544 | 29 1月23 | 12月 31, 9999 | 6 | 化学 |
EmployeeSalary
:
员工 | 工资 | 开始日期 | 结束日期 | 部门 |
---|---|---|---|---|
50 | 5000000 | 12 1月23 | 12月 31, 9999 | 6 |
我想加入这两个表,从表中我需要工资信息,而从表中,我需要最后一个电话号码,即在 2023 年 1 月 12 日和 2023 年 1 月 29 日期间输入的电话号码电话号码 - > 5478765 和当前部门名称。EmployeeSalary
Employee
我正在连接这两个表并使用函数提取以前的电话号码。但是,当它加入使用并且不显示以前的电话号码时。LAG
EmployeeID
DepartmentNumber
我需要这样的输出:
员工 | 工资 | 开始日期 | 结束日期 | 部门 | 电话号码 | 部门名称 |
---|---|---|---|---|---|---|
50 | 5000000 | 12 1月23 | 12月 31, 9999 | 5 | 5478765 | 化学 |
答:
0赞
Cetin Basoz
11/10/2023
#1
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 | 化学 |
2赞
John Cappelletti
11/10/2023
#2
如果员工有两个以上的角色,则为另一种选择。
例
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
评论
1赞
VB IN
11/13/2023
感谢约翰的回复。Cetin的回答更接近我想要的答案。
评论
Dept
5