Рассчитайте время прокрутки с момента события для каждой записи в SQL

Я работаю над запросом, чтобы рассчитать время, прошедшее с момента последнего профилактического обслуживания (PM) для каждой единицы оборудования в скользящем календаре. Цель состоит в том, чтобы построить фрейм данных для анализа того, когда произойдет ремонт.

Ниже приведена таблица результатов запроса, которая у меня есть, с добавленным столбцом «Время с последнего PM», который является столбцом, который мне нужен.

Назовите эту таблицу 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  

Данные о профилактическом обслуживании поступают из запроса/таблицы, настроенной следующим образом, т. е. Таблица 2.

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

Поэтому мне нужно убедиться, что для моего последнего запроса, таблицы 1, «Время с момента последнего PM» для оборудования 2069186 первая запись представляет собой разницу между неделей 5 2018 года в таблице 2 и неделей 10 2018 года. Для второй записи оборудования 2069186 «Время с последнего PM» должно представлять собой разницу между 21-й неделей 2018 г. в таблице 1 и 20-й неделей 2018 г. в таблице 2. Для оборудования 1626930 первая запись должна представлять собой разницу между 9-й неделей 2018 г. в таблице 1 и 40-й неделей 2017 г. в таблице 2. Для оборудования 1626930 вторая запись должна представлять собой разницу между неделей 3 2019 года в таблице 1 и неделей 40 2018 года в таблице 2. Имейте в виду, что мне нужна разница между текущей записью в таблице 1 и последним PM до года и недели. в таблице 1.

Запросы для Таблицы 1 и Таблицы 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

Любые предложения о том, как правильно соединить две таблицы и выполнить расчет? Или есть способ использовать временные таблицы и переменные, которые кто-нибудь может предложить? Любой вклад будет оценен!


person Omar123456789    schedule 07.02.2019    source источник
comment
Версия SQL сервера?   -  person Salman A    schedule 07.02.2019
comment
Да Microsoft SQL-сервер   -  person Omar123456789    schedule 07.02.2019


Ответы (1)


Вы можете использовать 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

Вычислить разницу в количестве недель будет сложно, и для этого вам понадобится количество недель в предыдущем году.

person Salman A    schedule 07.02.2019
comment
Это сделало трюк! Ценить это. Я никогда раньше не слышал о функции Apply в SQL Server, но мне нужно узнать о ней больше для будущих проектов. - person Omar123456789; 12.02.2019