Как получить дату последнего статуса службы?

#sql-server #tsql

#sql-server #tsql

Вопрос:

Я занят анализом наших машин и их обслуживания. У меня есть таблица, в которой каждая машина имеет свой статус работы с отметкой времени.

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

В принципе, я хочу закодировать синий столбец: SampleData

Вот некоторые примеры данных:

 DROP TABLE IF EXISTS #machineStatus
CREATE TABLE #machineStatus
(
    machineID VARCHAR(255),
    machineLine VARCHAR(255),
    machineStatus VARCHAR(255),
    periodStart DATETIME,
    periodEnd DATETIME
)

INSERT INTO #machineStatus
(
    machineId,
    machineLine,
    machineStatus,
    periodStart,
    periodEnd
)
VALUES
('01255783', '0251', 'Active', '2016-01-01 00:00:00', '2016-01-31 23:59:59'),
('01255783', '0251', 'Active', '2016-02-05 00:00:00', '2016-02-07 23:59:59'),
('01255999', '415', 'Active', '2016-01-01 00:00:00', '2016-01-31 23:59:59'),
('01255999', '415', 'Active', '2016-02-01 00:00:00', '2016-02-29 23:59:59'),
('01255999', '415', 'Maintenance', '2016-03-01 00:00:00', '2016-03-31 23:59:59'),
('01255783', '0251', 'Service', '2016-02-08 00:00:00', '2016-02-12 23:59:59'),
('01255783', '0251', 'Active', '2016-02-13 00:00:00', '2016-03-31 23:59:59'),
('01255783', '0251', 'Active', '2016-04-01 00:00:00', '2016-04-15 23:59:59'),
('01255783', '0251', 'Terminated', '2016-04-20 00:00:00', NULL),
('01255999', '415', 'Active', '2016-04-01 00:00:00', '2016-04-15 23:59:59'),
('01255999', '415', 'Active', '2019-01-01 00:00:00', '2020-02-26 23:59:59'),
('01255999', '415', 'Service', '2020-02-27 00:00:00', '2020-03-01 00:00:00'),
('01255999', '415', 'Active', '2020-03-01 00:00:00', '2020-03-01 23:59:59'),
('01255999', '415', 'Active', '2020-03-02 00:00:00', '2020-07-29 23:59:59'),
('01255999', '415', 'Service', '2020-07-30 00:00:00', '2020-07-31 23:59:59'),
('01255999', '415', 'Service', '2020-07-31 00:00:00', '2020-08-10 23:59:59'),
('01255999', '415', 'Active', '2020-08-11 00:00:00', '2020-08-30 23:59:59'),
('01255999', '415', 'Service', '2020-09-01 00:00:00', '2020-09-07 23:59:59'),
('01255999', '415', 'Service', '2020-09-08 00:00:00', '2020-10-10 23:59:59'),
('01255999', '416', 'Active', '2020-10-11 00:00:00', '2020-10-28 23:59:59'),
('01255999', '01000', 'Terminated', '2020-10-29 23:59:59', NULL)
 

Я немного поэкспериментировал с ROW_NUMBER(), и кажется, что, возможно, я смогу сделать это, немного повозившись, но коллега упомянул, что эти функции снижают производительность, и я должен держаться от них подальше.

Объем данных находится в диапазоне от 1 до 2 строк в таблице.

Ваша помощь очень ценится. Спасибо!

Комментарии:

1. пожалуйста, покажите ваш текущий запрос

Ответ №1:

Вложенный запрос — это один из вариантов получения требуемого результата

 SELECT s.*
, (
    SELECT MAX(ss.PeriodStart) 
    FROM machineStatus ss 
    WHERE ss.machineId = s.machineId 
        AND ss.machineStatus = 'Service' AND ss.PeriodStart < s.PeriodStart
)
FROM machineStatus s