如何在单日存在两次变更时更新DateFrom与DateTo间的行?
问题:处理员工历史表单日多变更的关联更新
业务背景
- 从
#tmpEmployeeHistory、#PayrollHistory、#ContractHistory三张历史表采集数据到#tmpFinalChangeSet:只要任意一张表存在变更记录,就将PersonId和变更日期(对应历史表的DATE_FROM字段)插入目标表。 - 数据采集完成后,需要从三张历史表补充
#tmpFinalChangeSet的字段信息,比如从EmployeeHistory取StatusId、从PayrollHistory取GrossIncome、从ContractHistory取ContractID,以此明确每个时间点(ChangeDate)对应的人员状态及相关信息。 - 只有
#EmployeeHistory会出现同一PersonId单日多次变更的情况,因此新增DaySeqNum字段记录当日变更顺序,两次变更都需要插入#tmpFinalChangeSet(因为对应的StatusId不同)。
#EmployeeHistory 数据示例
| PersonId | Date_From | DateTo | DaySeqNum | StatusId |
|---|---|---|---|---|
| 1 | 2018-06-01 | 2018-12-16 | 1 | 1 |
| 1 | 2018-12-17 | 2018-12-17 | 1 | 1 |
| 1 | 2018-12-17 | 2019-04-30 | 2 | 5 |
| 1 | 2019-05-01 | 2019-07-31 | 1 | 1 |
预期结果集
| Id | PersonId | ChangeDate | DaySeqNum | StatusId |
|---|---|---|---|---|
| 1 | 1 | 2018-06-16 | 1 | 1 |
| 2 | 1 | 2018-12-17 | 1 | 1 |
| 3 | 1 | 2018-12-17 | 2 | 5 |
| 4 | 1 | 2019-01-01 | 1 | 5 |
| 5 | 1 | 2019-05-01 | 1 | 1 |
现有问题与需求
尝试用以下UPDATE语句填充#tmpFinalChangeSet的StatusId字段,但执行后第4行(ChangeDate为2019-01-01)的StatusId为空:
UPDATE t SET t.StatusId = eh.StatusId FROM #tmpFinalChangeset t JOIN #tmpEmployementHistory eh ON EH.PERSON_ID = T.PersonId AND T.ChangeDate >= EH.DATE_FROM AND T.ChangeDate <= ISNULL(EH.DATE_TO, '99991231') AND EH.DaySeqNum = T.DaySeqNum
添加AND EH.DaySeqNum = T.DaySeqNum是为了避免ChangeDate为'2018-12-17'的两行都被设置为StatusId=1,但这一条件导致非单日变更的行(比如2019-01-01)无法匹配到对应的历史记录(因为该行DaySeqNum=1,而历史表中覆盖2019-01-01的记录DaySeqNum=2)。
需要实现的目标:为#tmpFinalChangeSet的每行唯一匹配#EmployeeHistory中日期区间覆盖该行ChangeDate的记录,但单日多次变更的场景无法直接用日期区间关联。目前已通过两次独立UPDATE解决问题(第一次不添加DaySeqNum匹配条件,第二次添加该条件修正DaySeqNum=2的行),但希望找到更优的解决方案(比如给DaySeqNum=2的ChangeDate增加1秒来实现唯一标识)。
内容的提问来源于stack exchange,提问作者Marian
相关产品推荐
相关产品推荐

