PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да обходите йерархична дървовидна структура назад с помощта на рекурсивни заявки

АКТУАЛИЗАЦИЯ 2: Пренаписах оригиналната рекурсивна заявка, така че цялото натрупване/агрегиране да се извършва извън рекурсивната част. Трябва да работи по-добре от предишната версия на този отговор. Това много прилича на отговор от @a_horse_with_no_name за подобен въпрос.

  WITH 
    RECURSIVE search_graph(edge, from_node, to_node, length, area, start_node) AS
    (
        SELECT edge, from_node, to_node, length, area, from_node AS "start_node"
        FROM tree
        UNION ALL
        SELECT o.edge, o.from_node, o.to_node, o.length, o.area, p.start_node
        FROM tree o
    JOIN search_graph p ON p.from_node = o.to_node
    )
    SELECT array_agg(edge) AS "edges"
       -- ,array_agg(from_node) AS "nodes"
          ,count(edge) AS "edge_count"
          ,sum(length) AS "length_sum"
          ,sum(area) AS "area_sum"
    FROM search_graph
    GROUP BY start_node
    ORDER BY start_node
;

Резултатите са според очакванията:

 start_node | edges       | edge_count | length_sum |  area_sum
------------+-------------+------------+------------+------------
  1         | {A}         |          1 |        1.1 |       0.9
  2         | {B}         |          1 |        1.2 |       1.3
  3         | {C}         |          1 |        1.8 |       2.4
  4         | {D,B,A}     |          3 |        3.5 |       3.5
  5         | {E,D,C,B,A} |          5 |        6.4 |       6.8



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ecto Query - Дати + Интервали на Postgres + Интерполация на заявки

  2. sql изберете най-ранната дата за множество редове

  3. Връзки "един към много" в (Postgre)SQL

  4. Импортиране на JSON файл в Postgresql 11 на Windows 10

  5. Защо неподписано цяло число не е налично в PostgreSQL?