Oracle SQL - Как мне составить список на основе начального и конечного местоположений клиентов? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица ниже, и я хотел бы узнать, какие клиенты совершили поездку, где его / ее start_location является end_location другого клиента, который совершил поездку <= 5 минут до него / нее. </p>

Например, вот что у меня:

DT                    Customer_Name       Start_location   End_location    Trip_fare
2019-11-01 08:17:42   Jane                  A                 B            $10
2019-11-01 08:18:02   Mary                  C                 A            $7
2019-11-01 08:18:04   Tom                   B                 D            $12
2019-11-01 08:20:11   Harry                 E                 C            $20
2019-11-01 08:21:22   Alex                  D                 A            $5
2019-11-01 08:24:30   Sally                 C                 B            $8

Это то, что я хочу:

DT                    Customer_Name    Start_location   End_location   
2019-11-01 08:17:42   Jane              A                 B
2019-11-01 08:18:04   Tom               B                 D  (cause Tom's start_location = B = Jane's end_location and the time difference between the 2 trips is within 5 minutes)
2019-11-01 08:21:22   Alex              D                 A
2019-11-01 08:20:11   Harry             E                 C 
2019-11-01 08:24:30   Sally             C                 B

Здесь Мэри была удалена из списка как ее start_location = 'C', что не является end_location Джейн, которая совершила поездку <= 5 минут до нее. </p>

Мои извинения за этот «беспорядочный» вопрос. Дайте мне знать, если вам нужны дополнительные разъяснения!

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 26 мая 2020

У меня есть таблица ниже, и я хотел бы узнать, какие клиенты совершили поездку, где его / ее start_location - это end_location другого клиента, совершившего поездку <= 5 минут до него / нее. </p>

Ваше описание проблемы предлагает not exists:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.end_loc = t.start_loc and
                        t2.dt < t.dt and
                        t2.dt >= t.dt - interval '5' minute
                 );

Однако это удаляет Тома, Алекса и Салли. Судя по тому, как вы описываете вопрос, я думаю, что это правильно.

Здесь - скрипка db <>.

1 голос
/ 26 мая 2020

Поскольку ваш запрос относится к клиентам из той же таблицы, вам потребуется самостоятельное присоединение. То есть вы присоединяетесь к столу с собой.

SELECT ... FROM mytable JOIN mytable ...

Чтобы отличить guish один «экземпляр» таблицы от другого, вам понадобятся псевдонимы:

SELECT ... FROM mytable t1 JOIN mytable t2 ...

И вам нужны условия соединения , вот как связаны ваши два клиента. В вашем примере это довольно просто:

SELECT tcust.name  AS name, 
       tother.name AS other_name
  FROM mytable tcust 
  JOIN mytable tother
    ON tcust.start_loc = tother.end_loc
   AND tcust.dt       >= tother.dt - INTERVAL '5' MINUTE;

Однако этот запрос дает немного другой результат. Можете ли вы узнать почему?

CREATE TABLE mytable (
  dt DATE, name VARCHAR2(30 CHAR), start_loc VARCHAR2(5 CHAR), 
  end_loc VARCHAR2(5 CHAR), fare NUMBER);

INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:17:42', 'Jane',  'A', 'B', 10);
INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:18:02', 'Mary',  'C', 'A', 7);
INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:18:04', 'Tom',   'B', 'D', 12);
INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:20:11', 'Harry', 'E', 'C', 20);
INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:21:22', 'Alex',  'D', 'A',  5);
INSERT INTO mytable VALUES (TIMESTAMP '2019-11-01 08:24:30', 'Sally', 'C', 'B',  8);

Результат:

NAME   OTHER_NAME
Tom    Jane 
Jane   Mary 
Alex   Tom  
Mary   Harry
Sally  Harry
Jane   Alex

Вычитание 5 минут объясняется в этом вопросе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...