为 SQL 中的每条记录计算事件以来的滚动时间

Calculate the rolling time since an event for each record in SQL

我正在处理一个查询,以计算滚动日历上每台设备自最近一次预防性维护 (PM) 以来的时间。目标是建立一个数据框来分析何时进行维修。

下面是我使用添加的列 "Time Since Last PM" 得到的查询结果的 table,这是我想要的列。

称这个 Table 1:

EquipmentNumber |Year   |weeknumber |Current Week Repair|Time Since Last PM  
2069186         |2018   |10         |1                  |5  
2069186         |2018   |21         |1                  |1  
1626930         |2018   |09         |1                  |21  
1626930         |2019   |03         |1                  |15  

预防性维护数据来自 query/table,其设置如下,即 Table 2.

Equipment Number |Year  |WeekNumber  
2069186          |2018  |5  
2069186          |2018  |20  
1626930          |2017  |40  
1626930          |2018  |40  

所以我需要确保对于我的最终查询,Table 1,设备 2069186 的“自上次下午以来的时间”第一条记录与 Table 2 中的 2018 年第 5 周不同到 2018 年第 10 周。对于设备 2069186 的第二条记录,“自上次下午以来的时间”应该是 Table1 中的 2018 年第 21 周和 Table2 中的 2018 年第 20 周之间的差异。对于设备 1626930,第一条记录应该是 Table1 中的 2018 年第 9 周与 Table2 中的 2017 年第 40 周的差异。对于设备 1626930,第二条记录应该是 Table1 中的 2019 年第 3 周的差异到 Table 2 中的 2018 年第 40 周。请记住,我想要 Table 1 中的当前记录与 Table 1 中的年份和周之前的最新 PM 之间的差异。

Table 1 和 Table 2 的查询非常基础。

 SELECT   
 DISTINCT EquipmentNumber,
 Year, 
 weeknumber,
 [Current Week Repair]
 FROM TableA

 SELECT 
 EquipmentNumber,
 DatePart(Year, Created) as Year,
 DatePart(Week, Created) as WeekNumber
 FROM TableB

关于加入两个 table 并进行计算的正确方法有什么建议吗?或者有没有办法利用任何人都可以建议的 temp tables 和变量?如有任何意见,我们将不胜感激!

您可以使用 APPLY:

SELECT t1.*, t1.WeekNumber - ca.WeekNumber
FROM t1
OUTER APPLY (
    SELECT TOP 1 Year, WeekNumber
    FROM t2
    WHERE Equipment_Number = t1.Equipment_Number
    AND (
        (Year < t1.Year)
        OR
        (Year = t1.Year AND WeekNumber < t1.WeekNumber)
    )
    ORDER BY Year DESC, WeekNumber DESC
) AS ca

计算周数差异会很棘手,为此您需要前一年的周数。