Как рассчитать разницу между двумя датами в хранимой процедуре для нескольких наборов в строках - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть такая таблица данных

id  typeid      date
12  exited      01-06-2017    
1   approved    05-06-2017
7   attended    08-06-2017
9   admitted    10-06-2017
45  approved    12-06-2017
67  admitted    16-06-2017 

Ответ, который я хочу получить, будет примерно таким:

difference(days)
5 
4 

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

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

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

select max(case when typeid = 'approved' then date end) as approved_date,
       max(case when typeid = 'admitted' then date end) as admitted_date,
       datediff(max(case when typeid = 'admitted' then date end),
                max(case when typeid = 'approved' then date end)
               ) as diff
from (select t.*,
             (@cnt := @cnt + (typeid = 'approved')) as grp
      from (select t.* from t order by date) t cross join
           (select @cnt := 0) params
     ) t
group by grp;

Это может использовать индекс на (date) для назначения grp. Тогда просто нужно сделать group by.

. Использование коррелированного подзапроса может стать довольно дорогим с ростом размера данных. Так что для больших данных это должно быть намного эффективнее.

В любом случае использование оконных функций (доступно в MySQL 8+) является гораздо более предпочтительным решением.

1 голос
/ 17 апреля 2020

Это на самом деле проблема, для которой оконные функции очень хорошо подходят, но поскольку вы используете версию 5.6, это невозможно. Вот один из способов сделать это:

SELECT
    DATEDIFF(
        (SELECT t2.date FROM yourTable t2
         WHERE t2.typeid = 'admitted' AND t2.date > t1.date
         ORDER BY t2.date LIMIT 1),
        t1.date) AS difference
FROM yourTable t1
WHERE
    typeid = 'approved'
ORDER BY
    date;

Лог c в приведенном выше запросе заключается в том, что мы ограничиваем только записи утвержденного типа. Для каждой такой записи, используя коррелированный подзапрос, мы затем ищем время вперед и время и находим ближайшую запись, которая имеет допустимый тип. Затем мы берем разницу между этими двумя датами.

Проверьте работающую демонстрационную ссылку ниже.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...