代码之家  ›  专栏  ›  技术社区  ›  Risu

如果雇员没有一个积极的雇主,那么给我一个无效的雇主

  •  0
  • Risu  · 技术社区  · 3 年前

    假设我有以下就业历史表:

    Employee ID | Employer ID | Start Date | End Date  | Status
    ---------------------------------------------------------------
      1         |  AA         |  1/1/2019  |           | Part-Time
      1         |  BB         |  1/1/2000  |           | Full-Time
      2         |  CC         |  3/1/2019  |           | Part-Time
      2         |  DD         |  3/1/2000  | 5/15/2021 | Full-Time
    

    以及ID为1、2和3的员工。

    select employee.id, employer.id 
    from Employee employee left join EmploymentHistory eh on eh.employeeId = employee.id 
    left join Employer employer on eh.employerId = employer.id
    

    但我不知道该怎么说,如果雇员没有在职雇主,那就给我一个空的雇主ID。如果他们有全职的在职(如无结束日期)就业历史记录,那就给我最新的记录,如果他们没有在职全职记录,那就给我最新的兼职记录。

    我开始用子查询进入循环,并尝试根据最大开始日期进行选择,我被各种各样的改变了。

    最后,我希望结果是这样的:

    Employee ID | Employer ID 
    ---------------------------
      1         |  BB         |
      2         |  CC         |
      3         |  <null>     |
    

    这可能吗?

    2 回复  |  直到 3 年前
        1
  •  0
  •   sticky bit    3 年前

    你可以试试 OUTER APPLY

    SELECT e.id,
           x.employerid
           FROM employee e
                OUTER APPLY (SELECT TOP 1
                                    eh.employerid
                                    FROM employmenthistory eh
                                    WHERE eh.employeeid = e.id
                                          AND eh.status IN ('Full-Time',
                                                            'Part-Time')
                                    ORDER BY eh.status ASC,
                                             eh.enddate DESC) x;
    
        2
  •  0
  •   Gordon Linoff    3 年前

    您可以只使用一个表:

    select eh.*
    from (select eh.*,
                 row_number() over (partition by employee_id order by startdate desc) as seqnum
          from EmploymentHistory eh
          where status = 'Full-Time'
         ) eh
    where seqnum = 1;