Подсчитать количество весов - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующая таблица:

История маршрутов

+----+-----------------+-----------------+---------------+-----------------+--------------+
| id |departure        | arrival         |terminal_ori_id| terminal_dest_id|next_route_id |
+----+-----------------+-----------------+---------------+-----------------+--------------+
| 8  |2020-05-01 12:00 |2020-05-01 17:00 |5              | 1               |  [null]      |       
| 9  |2020-05-01 08:00 |2020-05-01 10:00 |4              | 5               |  8           |            
| 10 |2020-05-01 03:00 |2020-05-01 07:00 |3              | 4               |  9           |            
+----+---------------------+-----------------+---------------+-----------------+--------------+

Я хочу напечатать время отправления и прибытия в определенном формате, название терминалы и количество весов полета. Например, рейс № 10 имеет масштаб до рейса № 9, а рейс № 9 имеет масштаб до рейса № 8. Таким образом, полет № 10 имеет 2 шкалы, а полет № 9 имеет 1 шкалу. Есть ли способ сделать это?

Вот что у меня есть в запросе:

SELECT h.id,
       to_char(h.departure, 'Mon DD YYYY HH:12:MI AM') departure, 
       to_char(h.arrival, 'Mon DD YYYY HH:12:MI AM') arrival, 
       t.name as terminal_origin,
       td.name as terminal_destiny,
FROM history_of_routes h
JOIN terminals t ON t.id = h.terminal_ori_id
JOIN terminals td ON td.id = h.terminal_dest_id;

Я просто скучаю по части весов, я понятия не имею, как это сделать.

1 Ответ

0 голосов
/ 30 апреля 2020

A рекурсивный CTE сделает работу:

WITH RECURSIVE cte AS (
   SELECT id, 0 AS scale, next_route_id
   FROM   history_of_routes h

   UNION ALL
   SELECT c.id, c.scale + 1, h.next_route_id
   FROM   cte c
   JOIN   history_of_routes h ON h.id = c.next_route_id
   WHERE  c.next_route_id IS NOT NULL  -- end of path
)
SELECT id, scale
FROM   cte
WHERE  next_route_id IS NULL;

Результат:

root_id | scale
------: | ----:
      8 |     0
      9 |     1
     10 |     2

db <> скрипка здесь

Предполагая, что next_route_id IS NULL завершает каждую траекторию полета. Интегрировано:

WITH RECURSIVE cte AS (
   SELECT id, 0 AS scale, next_route_id
   FROM   history_of_routes h

   UNION ALL
   SELECT c.id, c.scale + 1, h.next_route_id
   FROM   cte c
   JOIN   history_of_routes h ON h.id = c.next_route_id
   WHERE  c.next_route_id IS NOT NULL  -- end of path
)
SELECT c.id
     , c.scale
     , to_char(h.departure, 'Mon DD YYYY HH:12:MI AM') AS departure
     , to_char(h.arrival  , 'Mon DD YYYY HH:12:MI AM') AS arrival
     , o.name AS terminal_origin
     , d.name AS terminal_destiny
FROM   cte c
JOIN   history_of_routes h USING (id)
JOIN   terminals o ON o.id = h.terminal_ori_id
JOIN   terminals d ON d.id = h.terminal_dest_id
WHERE  c.next_route_id IS NULL;
...