Учитывая строку, представляющую путь, объединить итоговый столбец - PullRequest
0 голосов
/ 30 октября 2019

Скажем, у меня есть таблица, подобная следующей, которая представляет путь от 1 -> 2 -> 3 -> 4 -> 5:

+------+----+--------+
| from | to | weight |
+------+----+--------+
| a    | b  |      1 |
| b    | c  |      2 |
| c    | d  |      1 |
| d    | e  |      1 |
| e    | f  |      3 |
+------+----+--------+

Каждая строка знает, откуда она и откудасобирается

Я хотел бы объединить итоговую строку, которая принимает начальное имя, конечное имя и общий вес, например, так:

+------+----+--------+
| from | to | weight |
+------+----+--------+
| a    | f  |      8 |
+------+----+--------+

Первая таблица является результатом CTEвыражения, и я могу легко получить сумму предыдущего запроса с помощью SUM, но я не могу заставить LAST_VALUE работать аналогично:

WITH RECURSIVE cte AS (
  ...
)
SELECT *
FROM cte
UNION ALL
SELECT 'total', FIRST_VALUE(from), LAST_VALUE(to), SUM(weight)
FROM cte

FIRST_VALUEи для LAST_VALUE функций требуются пункты OVER, которые, кажется, добавляют ненужные сложности к тому, что я ожидал, поэтому я думаю, что я иду в неправильном направлении с этим. Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 30 октября 2019

Итак, я принял странное решение:

  1. Выбирает первое значение from (разделено на TRUE)
  2. Выбирает последнее значение to (разделено наTRUE снова)
  3. Крест объединяет сумму всех весов, ограниченную 1
WITH RECURSIVE cte AS (
    ...
)
SELECT *
FROM cte
UNION ALL (
    SELECT FIRST_VALUE(from) OVER (PARTITION BY TRUE), LAST_VALUE(to)  OVER (PARTITION BY TRUE), total
    FROM cte
    CROSS JOIN (
        SELECT SUM(weight) as total
        FROM cte
    ) tmp
    LIMIT 1
);

Это хаки? Да. Это работает? Тоже да. Я уверен, что есть лучшие решения, и я хотел бы услышать их.

...