Запрос SQL Server для расчета продолжительности времени для столбца, содержащего несколько записей datetime по номеру заказа и состоянию заказа - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужен запрос T-SQL для расчета продолжительности времени для столбца, содержащего несколько записей даты и времени, с номером заказа и состоянием заказа.

Пример:

enter image description here

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

Для нескольких записей номера заказа (например, C8P0070), Order by event_time_t DESC & Then ..

(Duration = (RESUME - HOLD)) + (RESUME - HOLD) + ...)

Ожидаемый результат:

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

', где у вас есть условие, которое подразумевает «запуск», например, «Возобновить», найдите следующее случившееся условие, которое прекращает действие для этого order_number - здесь я использовал CROSS APPLY, чтобы упорядочить будущие события по времени, и взять первый, который придетвместе (извините, мне пришлось переключить ASC на DESC, была ошибка в первый раз0

    select y.order_number_s, SUM(DATEDIFF(s,y.event_time_t,dq.event_time_t)) AS S  FROM YourTable y 
        CROSS APPLY 
            (SELECT TOP 1 y2.event_time_t 
                                FROM YourTable y2 
                                    WHERE y2.order_number_s = y.order_number_s 
                                            AND y2.event_time_t >= y.event_time_t 
                                            AND y2.order_state_s IN ('hold','end') 
                                            ORDER BY event_time_t ASC
            ) DQ
        WHERE y.order_state_s IN ('resume', 'start')
        GROUP BY y.order_number_s
0 голосов
/ 26 ноября 2018

Предполагая, что у "resume" и "hold" нет дубликатов, вы можете использовать lead() для получения следующего значения и затем агрегировать:

select order_number_s,
       sum(datediff(second, event_time_t, next_event_time_t)) as total_duration
from (select t.*,
             lead(event_time_t) over (partition by order_number_s order by event_time_t) as next_event_time_t
      from t
      where order_state_s in ('HOLD', 'RESUME')
     ) t
where order_state_s = 'HOLD'
group by order_number_s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...