Получить TIMEDIFF() в MySQL из всех строк

#mysql #sql #datetime #max #min

#mysql #sql #дата и время #макс #мин

Вопрос:

У меня есть user_tasks таблица, подобная:

 | id | user_id | created_at          | status   |
-------------------------------------------------
| 1  | 1       | 2020-08-04 13:00:00 | started  |
| 2  | 1       | 2020-08-04 13:00:00 | pending  |
| 3  | 1       | 2020-08-04 13:00:10 | pending  |
| 4  | 1       | 2020-08-04 13:00:40 | pending  |
| 5  | 1       | 2020-08-04 13:00:41 | finished |
  

Я хотел бы получить разницу между последним pending статусом и первым pending статусом за считанные секунды. Поэтому у меня есть этот запрос:

 SELECT 
    TIMEDIFF(
    (SELECT created_at FROM user_tasks WHERE user_id = 1 AND `status` = 'pending' ORDER BY created_at DESC LIMIT 1), 
    (SELECT created_at FROM user_tasks WHERE user_id = 1 AND `status` = 'pending' ORDER BY created_at ASC LIMIT 1)
    ) AS pending_time
  

Это дает мне результат за считанные секунды (-00:00:40) , как и ожидалось. Однако, как я могу добиться этого для каждого user_task ?

В конечном счете, я пытаюсь получить среднее pending_time значение от всех user_tasks за считанные секунды.

Ответ №1:

Если я правильно вас понял, вы можете использовать агрегацию:

 select user_id, timediff(max(created_at), min(created_at)) pending_time
from user_tasks
where status = 'pending'
group by user_id