计算鳞片的数量
Count the number of scales
我有以下 table:
路线历史
+----+-----------------+-----------------+---------------+-----------------+--------------+
| 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;
我只是缺少天平部分,我不知道该怎么做。
recursive 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<>fiddle here
假设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;
我有以下 table:
路线历史
+----+-----------------+-----------------+---------------+-----------------+--------------+
| 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;
我只是缺少天平部分,我不知道该怎么做。
recursive 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<>fiddle here
假设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;