Расчет срока службы SQL

Table: courier
я быимя
1AAA
2BBB
3CCC
4DDD
Table: tracking
я быкод отслеживанияположение делВремяcourier_id
0011доставлен2021-01-11 18:30:002
0022доставлен2021-01-14 17:30:004
0033доставлен2021-01-15 11:30:004
0044доставлен2021-01-15 13:30:002
Table: tracking_details
код отслеживанияположение делвремя
1перед транзитом2021-01-09 10:00:00
1В процессе перевозки2021-01-10 11:00:00
1В процессе перевозки2021-01-10 11:40:00
1В процессе перевозки2021-01-11 13:49:00
1В процессе перевозки2021-01-11 15:45:00
1доставлен2021-01-11 18:30:00
2перед транзитом2021-01-10 10:00:00
2В процессе перевозки2021-01-12 11:00:00
2В процессе перевозки2021-01-12 11:40:00
2В процессе перевозки2021-01-13 13:49:00
2В процессе перевозки2021-01-13 15:45:00
2доставлен2021-01-14 17:30:00
3перед транзитом2021-01-11 10:00:00
3В процессе перевозки2021-01-13 16:00:00
3В процессе перевозки2021-01-14 11:40:00
3доставлен2021-01-15 11:30:00
4перед транзитом2021-01-13 13:00:00
4В процессе перевозки2021-01-13 17:00:00
4В процессе перевозки2021-01-14 15:20:00
4доставлен2021-01-15 13:30:00
/* I would like to calculate the time difference 
from the first record of "in-transit" to the "delivered" 
for every tracking_code and take the avg for every courier */ 

/* so, the result for tracking_code="1" should be 31.5 hours (2021-01-10 11:00:00 to 2021-01-11 18:30:00) 
and tracking_code="2" should be 54.5 hours
tracking_code="3" = 43.5 hours
tracking_code="4" = 44.5 hours
courier.name="BBB" should be (31.5+44.5)/2= 38 hours 
and "DDD" should be (54.5+43.5)/2 = 49 hours */

 SELECT    courier.name,
      Avg(
           (
           SELECT     Max(t2.time)
           FROM       tracking_details t2
           INNER JOIN tracking_details t1
           ON         t1.tracking_code=t2.tracking_code
           WHERE      t2.status="in-transit"
           AND        t2.time>t1.time
           GROUP BY   t2.tracking_code)-
          (
                     SELECT     Max(t3.time)
                     FROM       tracking_code t3
                     INNER JOIN tracking_code t1
                     ON         t1.tracking_code=t3.tracking_code
                     WHERE      t3.status="delivered"
                     GROUP BY   t3.tracking_code))
FROM      tracking
LEFT JOIN tracking_details t1
where     courier.id=tracking.courier_id
GROUP BY  courier.name;

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *