SQL Server中的LAG函数在join中使用时无法捕获之前的记录信息

问题描述 投票:0回答:2

我有两张桌子:

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 化学
sql-server join lag
2个回答
0
投票
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 化学

DBFiddle 演示


0
投票

如果员工拥有两个以上角色,这只是另一种选择。

示例

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
© www.soinside.com 2019 - 2024. All rights reserved.