Как я могу сделать запрос sql, который вычитает время из разных строк? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть следующий набор данных, показывающий состояние определенных инструментов.

id || Toolid || time       || message    || timeToComplete
===========================================================
1  ||   1    || 1578294000 || running    || 153
2  ||   1    || 1578294153 || assistance || null
3  ||   1    || 1578294204 || done       || null
4  ||   1    || 1578294264 || running    || 208
5  ||   1    || 1578294472 || assistance || null
6  ||   1    || 1578294524 || done       || null
7  ||   2    || 1578294584 || running    || 127
8  ||   2    || 1578294711 || assistance || null
9  ||   2    || 1578294772 || done       || null

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

Требуется вывод чтобы выглядеть следующим образом:

Toolid || time       || timeToComplete || responseTime
================================================
1      || 1578294000 || 153            || 51
1      || 1578294264 || 208            || 52
2      || 1578294584 || 127            || 61

Другая проблема заключается в том, что сообщение помощи и сообщение о готовности не всегда точно равны 1. Они всегда приходят в одном и том же порядке от инструментов (работает-помощь-сделано).

Может ли кто-нибудь помочь мне с необходимым запросом?

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Я думаю, что вы хотите условную агрегацию - но вам нужна группировка. Вы можете рассчитать это, сложив количество «запущенных» сообщений для каждой строки:

select toolid,
       min(case when message = 'running' then time end) as time,
       min(timeToComplete) as timeToComplete,
       (min(case when message = 'done' then time end) -
        min(case when message = 'assistance' then time end)
       ) as responseTime
from (select t.*,
             sum(case when message = 'running' then 1 else 0 end) over (partition by toolid order by id) as grp
      from t
     ) t
group by toolid, grp;
0 голосов
/ 23 марта 2020

Вы можете использовать окно min() s, чтобы получить следующие строки "Помощь" и "Готово":

select tool_id, time, time_to_complete, response_time
from(
    select 
        t.*,
        min(case when message = 'done' then time end) over(
            partition by tool_id 
            order by time 
            rows between 1 following and unbounded following
        ) 
        - min(case when message = 'assistance ' then time end over(
            partition by tool_id 
            order by time 
            rows between 1 following and unbounded following
        ) response_time
        from mytable t
) t
where message = 'running'   
...