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 问题:根据操作代码获取以前的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以逐块获取最新数据

SQL Server 2012 - 使用 LAG 从以前的行中获取数据

SQL数据库代码如何根据日期获取属于哪个季度

根据日期获取某一时间段内的数据

如何根据我的要求更改 sql 查询?

对mysql数据的连接操作和关闭