SQL 问题:根据操作代码获取以前的数据
Posted
技术标签:
【中文标题】SQL 问题:根据操作代码获取以前的数据【英文标题】:SQL issue: Get Previous data based on a action code 【发布时间】:2021-09-12 20:15:37 【问题描述】:我被这个问题困住了。 表格结构也请参考截图。
SQL ISSUE SCREENSHOT
所以我们有 2 个表:HISTORY 表保存了工资率、位置等的历史记录 & POSITION 表仅按日期提供作业操作更改的详细信息。 期望的输出我们只想将 Action_code 视为 'JOB-CHANGE' 并在 action-job 更改之前获得最新的工资率和以前的工资率。
--- 表 1:历史 ---
EMPLOYEE | EFFECT_DATE | END_DATE | PAY_RATE | LOCAT_CODE |
---|---|---|---|---|
344 | 4/1/2021 | current - TBD | 42.44 | ATL |
344 | 3/2/2021 | 3/31/2021 | 41.81 | ATL |
344 | 3/31/2020 | 3/1/2021 | 41.81 | DTW |
--- table2 操作 ---
COMPANY | EMPLOYEE | EFFECT_DATE | ACTION_CODE | REASON_01 |
---|---|---|---|---|
100 | 344 | 3/31/2021 | LOA | ST-RTW |
100 | 344 | 3/2/2021 | JOB CHANGE | JC-TRANS(L |
100 | 344 | 5/31/2020 | LOA | ST-COVID90 |
--- 期望的输出 --
Employee | Action code | Reason_1 | Effective_Date | Previous_Location | Previous_Rate | New_Location | New_Pay_Rate |
---|---|---|---|---|---|---|---|
344 | JOB CHANGE | JC-TRANS(L | 3/2/2021 | DTW | 41.81 | ATL | 42.44 |
你能帮帮我吗?非常感谢:)提前
【问题讨论】:
这两张表你建议怎么加入,有哪些共同的列,不清楚?到目前为止,您尝试了什么 常用列是操作代码、日期、工资率。几乎所有东西。棘手的部分是只考虑动作代码-JOB CHANGE,并获得最大和一个级别的工资率,就像它在所需的输出中显示的那样 这并不复杂:只是一个简单的LEAD/LAG
。困难的一点是你想如何匹配行。我看到的唯一常见的列是EMPLOYEE, EFFECT_DATE
。如果你在这两个上匹配,日期是否包含时间部分,那么我们是否进行完全匹配?或者我们是否从history
表中获得该日期或之前的第一行? New_Pay_Rate: 42.44
是怎么算出来的,我不明白逻辑
好的,那么我们应该由 EMPLOYEE 加入。我们要考虑行动的生效日期。在 ACTION 中,工作变更发生在 2021 年 3 月 2 日,因此我们想检查工作变更发生之前的工资率和地点以及之后的工资率和地点(变成新工资率和新地点)跨度>
所以困扰我的是...如果我们将 DTW 视为以前的位置,那么新的工资率仍将是 HISTORY 表第二行中的 41.81 cz...新位置已被捕获为 ATL以相同的 41.81 率...
【参考方案1】:
您可以使用OUTER APPLY (SELECT TOP (1)
获取日期当天或之前的第一个匹配行。
在APPLY
中,您可以使用LEAD
向后访问下一行的值。
SELECT
a.EMPLOYEE,
[Action code] = h.ACTION_CODE,
a.REASON_01,
Effective_Date = a.EFFECT_DATE,
hPrev.Previous_Location,
hPrev.Previous_Rate,
hNew.New_Location,
hNew.New_Pay_Rate
FROM ACTION a
OUTER APPLY (
SELECT TOP (1)
Previous_Location = h.LOCAT_CODE,
Previous_Rate = h.PAY_RATE
FROM HISTORY h
WHERE h.EFFECT_DATE < a.EFFECT_DATE
AND h.Employee = a.Employee
ORDER BY h.EFFECT_DATE DESC
) hPrev
OUTER APPLY (
SELECT TOP (1)
New_Location = h.LOCAT_CODE,
New_Pay_Rate = h.PAY_RATE,
FROM HISTORY h
WHERE h.EFFECT_DATE > a.EFFECT_DATE
AND h.Employee = a.Employee
ORDER BY h.EFFECT_DATE
) hNew
WHERE a.ACTION_CODE = 'JOB CHANGE';
【讨论】:
哦,让我在 DB 中尝试一下,非常感谢,我会尽快告诉你进展如何 它适用于 MS SQL? cz它没有正确绑定。我收到错误消息:消息 102,级别 15,状态 1,第 3 行 '.' 附近的语法不正确。消息 156,级别 15,状态 1,第 20 行关键字“ORDER”附近的语法不正确。 抱歉缺少逗号 知道了,我添加它们 嗨,所以在输出中,'New_Pay rate' 仍然是 41.81。它不是 42.44以上是关于SQL 问题:根据操作代码获取以前的数据的主要内容,如果未能解决你的问题,请参考以下文章