Хочу заказать на SQL сервере, где первая строка такая же, а потом другая - PullRequest
3 голосов
/ 09 июля 2020

Дело в том, что начальная точка для линии одна и та же, скажем, линия поезда. Линия начинается в одной и той же точке, но заканчивается в разных конечных точках. Услуги зависят от линии, по которой они едут.

Я добавил дополнительную запрошенную информацию, она может быть расширена дополнительными строками.

Пример таблицы:

Начальный ситуация:

Name    Next    Result
1000    1100    1
1100    1200    2
1100    2000    2
1200    1300    3
2000    3000    3
3000    4000    4
1300    1400    4
1400    1500    5
4000    5000    5

Ожидаемый результат:

Name    Next    Result
1000    1100    1
1100    1200    2
1200    1300    3
1300    1400    4
1400    1500    5
1000    1100    1
1100    2000    2
2000    3000    3
3000    4000    4
4000    5000    5

Если к входу примера добавить одну дополнительную строку, результат изменится следующим образом ...

Пример таблица:

Исходная ситуация:

Name    Next    Result
1000    1100    1
1100    1200    2
1100    2000    2
1200    1300    3
2000    3000    3
3000    4000    4
1300    1400    4
1400    1500    5
4000    5000    5
4000    4100    5  -- Additional single row

Ожидаемый результат:

Name    Next    Result
1000    1100    1
1100    1200    2
1200    1300    3
1300    1400    4
1400    1500    5
1000    1100    1
1100    2000    2
2000    3000    3
3000    4000    4
4000    5000    5
1000    1100    1  -- Everything from here is additional, caused by the one additional input row
1100    2000    2
2000    3000    3
3000    4000    4
4000    4100    5

1 Ответ

3 голосов
/ 09 июля 2020

Похоже, вы описываете древовидную структуру ...

           /- 1200 - 1300 - 1400
1000 - 1100
           \- 2000 - 3000 - 4000

Тогда результатом будут оба (все) пути от узла root.

WITH
  leaf AS
(
  SELECT *
    FROM nodes
   WHERE NOT EXISTS (SELECT *
                       FROM nodes AS lookup
                      WHERE lookup.name = nodes.next
                    )
),
  recursed_path AS
(
  SELECT
    *,
    next AS branch_name,
    0    AS level
  FROM
    leaf

  UNION ALL

  SELECT
    root.*,
    leaf.branch_name,
    level + 1
  FROM
    recursed_path  AS leaf
  INNER JOIN
    nodes          AS root
      ON root.next = leaf.name
)
SELECT
  *
FROM
  recursed_path
ORDER BY
  branch_name,
  level DESC

РЕДАКТИРОВАТЬ:

Внесены незначительные исправления, и эта ссылка на рабочую демонстрацию ...

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