2017-04-22 6 views
-1

Mit SQL möchte ich der Baumstruktur bis zum letzten Blatt folgen. Baum = 1 und Knoten = 2; Baum = 1 und Knoten = 3; Baum = 1 und Knoten = NULL (kumulative Wahrscheinlichkeit); Baum = 2 und Knoten = 4; Baum = 2 und Knoten = 5; Baum = 2 und Knoten ist null (kumulative Wahrscheinlichkeit); Baum = 3 und Knoten = 6; Baum = 3 und Knoten ist null (kumulative Wahrscheinlichkeit); Baum = 4 und Knoten ist null (kumulative Wahrscheinlichkeit); Baum = 5 und Knoten ist null (kumulative Wahrscheinlichkeit); Baum = 6 und Knoten ist Null (kumulative Wahrscheinlichkeit);Die Höhe des Baumes finden

+0

nicht sicher, vielleicht [hierarchische Abfragen] (https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315) helfen kann Sie. Wenn Sie Ihr Datenorganisationsbeispiel, Tabellenstruktur oder etwas anderes angeben, wird es einfacher, die Lösungswege zu verstehen. – Seyran

+0

Was meinst du mit "Wahrscheinlichkeit nehmen"? Welche Wahrscheinlichkeit? Wie wird es berechnet? – mathguy

+0

In Ihrem Beispiel Wahrscheinlichkeit ist nur Blatt Wert, so Abfrage in meiner Antwort berechnet ist in Ordnung, wenn einen echten Baum der Wahrscheinlichkeiten bauen, dann sollte jeder Knoten Wahrscheinlichkeit haben, Antwort von @ MT0 zeigt, dass, wenn ich seinen Code richtig verstanden er angenommen Wahrscheinlichkeit, zu jedem Knoten zu gehen, ist gleich, und wenn keine anderen Bedingungen definiert sind, ist es auch richtig. – Seyran

Antwort

0

Wenn Sie Daten wie folgt organisieren können Sie die folgende

with TREETAB as (
select '1' treenode, '2' nodeval from dual 
union all 
select '1' treenode, '3' nodeval from dual 
union all 
select '1' treenode, 'leaf1' nodeval from dual 
union all 
select '2' treenode, '4' nodeval from dual 
union all 
select '2' treenode, '5' nodeval from dual 
union all 
select '2' treenode, 'leaf2' nodeval from dual 
union all 
select '3' treenode, '4' nodeval from dual 
union all 
select '3' treenode, 'leaf3' nodeval from dual 
union all 
select '4' treenode, 'leaf4' nodeval from dual 
union all 
select '5' treenode, 'leaf5' nodeval from dual 
union all 
select '6' treenode, 'leaf6' nodeval from dual 
) 

select * 
    from (SELECT t.*, CONNECT_BY_ISLEAF Leaf, 
       SYS_CONNECT_BY_PATH(nodeval, '/') "Path", level 
      FROM TREETAB t 
      start with t.treenode = 1 
     CONNECT BY PRIOR t.nodeval = to_char(t.treenode)) 
where Leaf = 1 
order by treenode; 

tun Wenn brauchen keine detaillierten Informationen über Baum, Blatt und einem Pfad, können Sie einfach überprüfen, was es treenode für nodeval nicht gleichwertig ist wie dies

with TREETAB as 
(select '1' treenode, '2' nodeval 
    from dual 
    union all 
    select '1' treenode, '3' nodeval 
    from dual 
    union all 
    select '1' treenode, 'leaf1' nodeval 
    from dual 
    union all 
    select '2' treenode, '4' nodeval 
    from dual 
    union all 
    select '2' treenode, '5' nodeval 
    from dual 
    union all 
    select '2' treenode, 'leaf2' nodeval 
    from dual 
    union all 
    select '3' treenode, '4' nodeval 
    from dual 
    union all 
    select '3' treenode, 'leaf3' nodeval 
    from dual 
    union all 
    select '4' treenode, 'leaf4' nodeval 
    from dual 
    union all 
    select '5' treenode, 'leaf5' nodeval 
    from dual 
    union all 
    select '6' treenode, 'leaf6' nodeval from dual) 

select * 
    from TREETAB t 
where not exists 
(select t.treenode from TREETAB t2 where t2.treenode = t.nodeval) 
+0

Entschuldigung, ich verstehe dich nicht klar, dass Baumzustand ist, der Code oben unabhängig von Baumlänge. Benutzte Daten sind nur für Beispiel. – Seyran

0

die Wahrscheinlichkeiten Unter der Annahme, über Sie sprechen, ist eine gleiche Wahrscheinlichkeit für jeden Zweig dann:

WITH data (tree, knot) AS (
    SELECT 1, 2 FROM DUAL UNION ALL 
    SELECT 1, 3 FROM DUAL UNION ALL 
    SELECT 1, NULL FROM DUAL UNION ALL 
    SELECT 2, 4 FROM DUAL UNION ALL 
    SELECT 2, 5 FROM DUAL UNION ALL 
    SELECT 2, NULL FROM DUAL UNION ALL 
    SELECT 3, 6 FROM DUAL UNION ALL 
    SELECT 3, NULL FROM DUAL UNION ALL 
    SELECT 4, NULL FROM DUAL UNION ALL 
    SELECT 5, NULL FROM DUAL UNION ALL 
    SELECT 6, NULL FROM DUAL 
), 
probabilities (tree, knot, probability) AS (
    SELECT tree, knot, 1/COUNT(1) OVER (PARTITION BY tree) FROM data 
), 
cumulative_probabilities (tree, knot, probability, path) AS (
    SELECT p.*, '/' || tree 
    FROM probabilities p 
    WHERE tree = 1 
UNION ALL 
    SELECT p.tree, p.knot, p.probability * cp.probability, cp.path || '/' || p.tree 
    FROM probabilities p 
     INNER JOIN 
     cumulative_probabilities cp 
     ON (p.tree = cp.knot) 
) 
SELECT * 
FROM cumulative_Probabilities 
WHERE knot IS NULL; 

Ausgang:

TREE KNOT PROBABILITY PATH 
---- ---- ----------- ------ 
    1  0.333333333 /1 
    3  0.166666667 /1/3 
    2  0.111111111 /1/2 
    6  0.166666667 /1/3/6 
    4  0.111111111 /1/2/4 
    5  0.111111111 /1/2/5 
Verwandte Themen