MySQL - Нахождение разницы во времени между строками для разных идентификаторов - PullRequest
0 голосов
/ 28 мая 2018

У меня есть таблица, которая состоит из следующих данных:

ID   status-before             status-current         DATE-timestamp         
5    Un-Assigned                Assigned              2013-12-17 14:14:04
5    Assigned                   Completed             2013-12-21 14:14:04
7    Un-Assigned                Assigned              2014-01-02 14:14:04 
7    Assigned                   Completed             2014-01-21 14:14:04
7    Completed                  Locked                2014-01-21 14:14:04
8    Un-Assigned                Assigned              2014-12-21 14:14:04
8    Assigned                   Completed             2014-12-27 14:14:04

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

Я хочу, чтобы мой конечный результат был таким, как показано ниже

ID   status-before              status-current     DATE-timestamp       Time Diff(Hours)
5    Un-Assigned                Assigned        2013-12-17 14:14:04    xx
5    Assigned                   Completed       2013-12-21 14:14:04    xx
7    Un-Assigned                Assigned        2014-01-02 14:14:04    xx 
7    Assigned                   Completed       2014-01-21 14:14:04    xx
7    Completed                  Locked          2014-01-21 14:14:04    xx
8    Un_Assigned                Assigned        2014-12-21 14:14:04    xx
8    Assigned                   Completed       2014-12-27 14:14:04    xx

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Если вас интересует разница во времени между Назначенным и Завершенным, вы можете воспользоваться приведенным ниже сценарием.

SELECT a.ID, 
   b.[status-after], 
   a.[DATE-timestamp], 
   DATEDIFF(Hour, a.[DATE-timestamp], b.[DATE-timestamp]) AS TimeDiff_Hours
FROM YourTable a
JOIN YourTable b 
ON a.ID = b.ID AND b.[status-after] = 'Completed'
WHERE a.[status-after] = 'Assigned'
0 голосов
/ 28 мая 2018

Предположительно, вы хотите, чтобы разница во времени соответствовала статусу next для идентификатора.Позвольте мне предположить MySQL до версии 8. Вы можете получить следующую метку времени, используя коррелированный подзапрос, а затем использовать timestampdiff():

select t.*,
       timestampdiff(hour, date_timestamp, next_datetimestamp) as diff_hours
from (select t.*,
             (select t2.date_timestamp
              from t t2
              where t2.id = t.id and
                    t2.date_timestamp > t.date_timestamp
              order by t2.date_timestamp asc
             ) as next_date_timestamp
      from t
     ) t;

Если вы используете MySQL 8.0, вы можете упростить эту логику, используяlead() функция.

0 голосов
/ 28 мая 2018

Используйте TIMEDIFF для возврата hours:minutes:seconds или DATEDIFF для возврата days

SELECT TIMEDIFF('complete.TIMESTAMP','assign.TIMESTAMP');
SELECT DATEDIFF('complete.TIMESTAMP','assign.TIMESTAMP');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...