如何编写SQL MERGE查询来生成历史表

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

我对 SQL 相当陌生,遇到了如下问题。 我有一个 EMPLOYEE 表,每天都会用最新数据刷新。它有 5 列: 员工 ID、姓名、职位、地点、费率

我想编写一个查询,从 EMPLOYEE 表中进行选择,并在 EMPLOYEE_HISTORY 表中写入包含 Start_Date 和 End_Date 列的记录(如果自昨天以来有任何值发生更改)。

示例:

第一天员工表:

员工ID 姓名 位置 地点 价格
1001 约翰·多伊 经理 CA 45
1002 鲍勃·罗曼 分析师 32

EMPLOYEE_HISTORY 最初将为空。在 Day1 运行查询后,它应该具有 Start_Date 为 Day1 且 End_Date 为 NULL 的所有记录:

第 1 天的预期 EMPLOYEE_HISTORY 表:

员工ID 姓名 位置 地点 价格 开始_日期 结束_日期
1001 约翰·多伊 经理 CA 45 日期1
1002 鲍勃·罗曼 分析师 32 日期1

第 2 天员工表:

员工ID 姓名 位置 地点 价格
1001 约翰·多伊 经理 CA 45
1002 鲍勃·罗曼 分析师 35

注意:Bob 的利率已更改

在第 2 天运行查询后,Bob 的较早记录必须是结束日期,并且应插入新记录。

第 2 天的预期 EMPLOYEE_HISTORY 表:

员工ID 姓名 位置 地点 价格 开始_日期 结束_日期
1001 约翰·多伊 经理 CA 45 日期1
1002 鲍勃·罗曼 分析师 32 日期1 日期2
1002 鲍勃·罗曼 分析师 35 日期2

我知道它应该是一个使用“WHEN NOT MATCHED”子句的 MERGE 语句,但无法完整地表述它。

sql merge databricks
1个回答
0
投票
MERGE INTO EMPLOYEE_HISTORY AS EH
USING EMPLOYEE AS E
ON EH.EmployeeID = E.EmployeeID
WHEN MATCHED AND (EH.Name <> E.Name OR EH.Position <> E.Position OR EH.Location <> E.Location OR EH.Rate <> E.Rate) THEN
    UPDATE SET EH.End_Date = CURRENT_DATE
WHEN NOT MATCHED BY TARGET THEN
    INSERT (EmployeeID, Name, Position, Location, Rate, Start_Date, End_Date)
    VALUES (E.EmployeeID, E.Name, E.Position, E.Location, E.Rate, CURRENT_DATE, NULL)
WHEN NOT MATCHED BY SOURCE THEN
    UPDATE SET EH.End_Date = CURRENT_DATE
OUTPUT $action, inserted.EmployeeID, inserted.Name, inserted.Position, inserted.Location, inserted.Rate, inserted.Start_Date, inserted.End_Date;
© www.soinside.com 2019 - 2024. All rights reserved.