gpt4 book ai didi

sql - 带递归 Postgres 查询的约束

转载 作者:行者123 更新时间:2023-11-29 13:32:37 24 4
gpt4 key购买 nike

我希望在遍历数据时跳过某个城市。目前,此查询可用于查找从 SLC 到 LA 的所有可用航类,包括中途停留的航类。您将在下图中看到这一点。

flights from SLC to LA

但是,我希望能够在飞行计划中排除某些城市。例如,如果蒙特利尔是 SLC 和洛杉矶之间的一站,则不会考虑该行程。我试过在 WHERE 子句中放入各种东西,但无济于事。还有其他建议吗?下面给出了示例数据和查询。

WITH RECURSIVE segs AS (
SELECT f0.flight_num::text as flight
, src_city, dest_city
, dep_time AS departure
, arr_time AS arrival
, airfare, mileage
, 1 as hops
, (arr_time - dep_time)::interval AS total_time
, '00:00'::interval as waiting_time
FROM flight f0
WHERE src_city = 'SLC' -- <SRC_CITY>
UNION ALL
SELECT s.flight || '-->' || f1.flight_num::text as flight
, s.src_city, f1.dest_city
, s.departure AS departure
, f1.arr_time AS arrival
, s.airfare + f1.airfare as airfare
, s.mileage + f1.mileage as mileage
, s.hops + 1 AS hops
, s.total_time + (f1.arr_time - f1.dep_time)::interval AS total_time
, s.waiting_time + (f1.dep_time - s.arrival)::interval AS waiting_time
FROM segs s
JOIN flight f1
ON f1.src_city = s.dest_city
AND f1.dep_time > s.arrival -- you can't leave until you are there
)
SELECT *
FROM segs
WHERE dest_city = 'LA' -- <DEST_CITY>
ORDER BY airfare desc
;

create table flight
( flight_num BIGSERIAL PRIMARY KEY
, src_city varchar
, dest_city varchar
, dep_time TIME
, arr_time TIME
, airfare INTEGER
, mileage INTEGER
);

insert into flight VALUES
(101, 'Montreal', 'NY', '05:30', '06:45', 180, 170),
(102, 'Montreal', 'Washington', '01:00', '02:35', 100, 180),
(103, 'NY', 'Chicago', '08:00', '10:00', 150, 300),
(105, 'Washington', 'KansasCity', '06:00', '08:45', 200, 600),
(106, 'Washington', 'NY', '12:00', '13:30', 50, 80),
(107, 'Chicago', 'SLC', '11:00', '14:30', 220, 750),
(110, 'KansasCity', 'Denver', '14:00', '15:25', 180, 300),
(111, 'KansasCity', 'SLC', '13:00', '15:30', 200, 500),
(112, 'SLC', 'SanFran', '18:00', '19:30', 85, 210),
(113, 'SLC', 'LA', '17:30', '19:00', 185, 230),
(115, 'Denver', 'SLC', '15:00', '16:00', 75, 300),
(116, 'SanFran', 'LA', '22:00', '22:30', 50, 75),
(118, 'LA', 'Seattle', '20:00', '21:00', 150, 450);

最佳答案

要从飞行计划中排除某些城市,您应该在查询中的 2 个位置添加 where 子句,如下所示:

  1. 在 src_city 条件之后

    ... 
    WHERE src_city = 'SLC' -- <SRC_CITY>
    AND dest_city <> 'Montreal'
    ...
  2. 在递归连接条件下

    ...
    AND f1.dep_time > s.arrival -- you can't leave until you are there
    AND f1.dest_city <> 'Montreal'
    ...

    我没有 Postgress,但我用 SQL Server 试了一下,它似乎可以工作。

关于sql - 带递归 Postgres 查询的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20078725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com