2016-12-09 3 views
0

Я играю с расписанием поездов и рассматриваю связь между станциями со времени.Построить пар из упорядоченного списка

Давайте рассмотрим пример:

Trip I: A (t1) ------------> B (t3) ------------> E (t5) 
Trip II:   C (t2) ------------> D (t4) ---> E (t6) 

У нас есть 5 остановок (A до E), где поезда останавливаются во время ti с двумя различными поездок (от A до E через B и от C to E though d`) ,

Время таблица выглядит следующим образом (на точке зрения базы данных, существует также технический идентификатор):

-------------------- 
| Trip | Stop | Time | 
-------------------- 
| I | A | t1 | 
| I | B | t3 | 
| I | E | t5 | 
| II | C | t2 | 
| II | D | t4 | 
| II | E | t6 | 
-------------------- 

Я хотел бы построить из этого соединения между станциями, что-то вроде (давайте не будем принимать во внимание время, затрачиваемое поезда на станции остановились для простоты):

--------------------------------------------------------------- 
| Departure stop | Departure time | Arrival stop | Arrival time | 
--------------------------------------------------------------- 
| A    | t1    | B   | t3   | 
| B    | t3    | E   | t5   | 
| C    | t2    | D   | t4   | 
| D    | t4    | E   | t6   | 
--------------------------------------------------------------- 

Я уже сделал это в память с некоторым кодом:

  1. группировка по поездкам,
  2. Сортировка по времени,
  3. снятие элементов 2-на-2 в скользящем окне.

Однако, это просто, но не очень эффективно.

Вот почему мне интересно, можно ли его выражать с помощью SQL. Не так ли?

Как вы поживаете?

Я использую PostgreSQL для своих тестов, но меня больше интересуют контуры, чем точная реализация для конкретной базы данных.

ответ

2

первый я бы генерировать RowNumber для каждого раздела поездки, а затем самостоятельно присоединиться на row_number + 1 = row_number

Каждая строка для каждой поездки, двигатель будет присвоен номер 1-N в порядке время по возрастанию. Это позволяет нам просто присоединяться к строке row_number + 1.

Если это может быть проблемой, если время просто ПРОСТО, и у вас есть вылет в 2300 и прибытие в 0100 или если поездка охватывает дни. Я также принимаю военное время здесь. Если это 11:00 и 1:00, тогда у нас могут быть проблемы.

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

WITH CTE As (
SELECT A.*, row_Number() over (partition by trip Order by time asc) RN FROM TIME A) 

SELECT A.Stop, A.Time, B.Stop, B.Time 
FROM CTE A 
INNER JOIN CTE B 
    on A.RN+1 = B.RN 
and A.trip = B.Trip 
+0

Нет проблем для времени остовного: раз сохраняются в секундах, начиная с полуночи (так поезд прибывает на следующий день в 01:00 будет расценено как поезд прибывает в тот же тот же день в «25:00») , –

+0

CTE не требуется на 100%, но я думаю, что он чище, чем необходимость генерировать результат набора дважды (один раз для каждого использования CTE), и если мы не разделились при поездке, нам не нужно было бы присоединяться к поскольку каждая строка будет иметь собственное время, но нам нужно будет заказать поездку, а затем время. – xQbert

+0

Спасибо!Мне нужно немного отладить мой набор данных, но кажется, что он строит поездки только одним способом: с A <--> B <--> C, я получаю A -> B и B -> C, но не C -> B и B-- > A. Возможно, я что-то пропустил. –

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