2013-11-19 3 views
1

Я ищу, чтобы пропустить определенный город, когда я перемещаю свои данные. В настоящее время этот запрос работает, чтобы найти все доступные рейсы из SLC в Лос-Анджелес, включая поездки с остановками. Вы увидите это на рисунке ниже.Ограничения с рекурсивным запросом Postgres

flights from SLC to LA

Однако, я хочу, чтобы иметь возможность исключить некоторые города в плане полета. Например, если Монреаль является остановкой между SLC и LA, эта поездка не будет рассматриваться. Я пробовал использовать различные вещи в предложениях 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); 
+0

Это зависит от ваших клиентов. Он должен определить критерии. –

+0

http://stackoverflow.com/a/20051387/905902 ИМХО, вы не приложили слишком много усилий в этот новый вопрос. – wildplasser

ответ

1

Чтобы исключить некоторые города из плана полета следует добавить, где пункты в 2-х местах в запросе следующим образом:

  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, и это, кажется, работает.

Смежные вопросы