【问题标题】:SQL Server Group Records Based Another Columns基于另一列的 SQL Server 组记录
【发布时间】:2020-08-08 14:59:29
【问题描述】:

我正在处理一个包含员工数据的表。该表具有基于部门和年份的历史员工记录,如下所示:

现在我想根据 EmployeeId、Department 合并记录并像这样获取 Min FromYear 和 Max ToYear:

我尝试使用查询:

Select EmployeeId, Department, MIN(FromYear), MAX(ToYear)
from Employee
GROUP BY EmployeeId, Department

但是对于 ID 为 3 的员工,此查询失败,因为它只返回 2 行:

我在这里添加了类似的结构和查询:http://sqlfiddle.com/#!9/6f1e53/5

任何帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    这是一个孤岛问题。使用lag() 和累积总和识别岛屿。然后聚合:

    select employeeid, department, min(fromyear), max(toyear)
    from (select e.*,
                 sum(case when prev_toyear >= fromyear - 1 then 0 else 1 end) over (partition by employeeid order by fromyear) as grp
          from (select e.*,
                       lag(toyear) over (partition by employeeid, department order by fromyear) as prev_toyear
                from employee e
               ) e
          ) e
    group by employeeid, department, grp
    order by employeeid, min(fromyear);
    

    Here 是一个 dbfiddle。

    【讨论】:

      【解决方案2】:

      你也可以使用自加入

      从雇员 a 中选择 a.employeeid、min(a.fromyear)、max(b.toyear)
      在 a.employeeid=b.employeeid 上内部连接 ​​emp b 按 a.employeeid 分组

      【讨论】:

        猜你喜欢
        • 2019-05-16
        • 1970-01-01
        • 2013-09-05
        • 2021-04-02
        • 2019-07-15
        • 2020-12-06
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        相关资源
        最近更新 更多