【发布时间】:2021-11-17 09:51:50
【问题描述】:
当任何其他维度列(员工、部门、工作、职位状态)中没有其他更改时,我正在尝试合并员工历史记录并获取最小开始日期和最大结束日期。
输出:
用于创建表和填充数据的脚本:
create table EmployeeHistory (EmployeeHistoryID INT,
EmployeeID INT,
DepartmentID INT,
JobID INT,
PositionStatusID INT,
StartDate DATE,
EndDate DATE)
insert into EmployeeHistory values (123, 362880, 450, 243, 1, '2019-05-28', '2020-05-03')
insert into EmployeeHistory values (124, 362880, 450, 243, 2, '2020-05-04', '2020-08-20')
insert into EmployeeHistory values (125, 362880, 450, 243, 1, '2020-08-21', '2020-08-31')
insert into EmployeeHistory values (126, 362880, 450, 243, 1, '2020-09-01', '2021-09-23')
insert into EmployeeHistory values (127, 362881, 450, 243, 1, '2019-07-01', '2019-07-31')
insert into EmployeeHistory values (128, 362881, 450, 243, 1, '2019-08-01', '2021-09-23')
当我使用分析函数或 group by 时,它正在合并第 1、3 和 4 行,但我只想合并 3 和 4,因为所有其他列都相同。即使第 1 行与第 3 行和第 4 行相同,但在这种情况下,为了维护历史第 1 行不应该合并到第 3 行和第 4 行。
示例代码,我正在使用:
select distinct *
from (select MAX(EmployeeHistoryID) OVER (PARTITION BY EmployeeID, DepartmentID, JobID, PositionStatusID) AS EmployeeHistoryID,
EmployeeID,
DepartmentID,
JobID,
PositionStatusID,
MIN(StartDate) OVER (PARTITION BY EmployeeID, DepartmentID, JobID, PositionStatusID) AS StartDate,
MAX(EndDate) OVER (PARTITION BY EmployeeID, DepartmentID, JobID, PositionStatusID) AS EndDate
from EmployeeHistory) m
【问题讨论】:
标签: sql sql-server tsql grouping aggregate-functions