2017-04-22 5 views
-1

SQLを使用して、最後の葉までツリー構造に従いたいと思います。 Tree = 1、Knot = 3、Tree = 1、Knot = NULL(累積確率)、Tree = 2、Knot = 4;ツリー= 2、ノット= 5、ツリー= 2、ノットはヌル(累積確率)。ツリー= 3、ノット= 6、ツリー= 3、ノットはヌル(累積確率)、ツリー= 4、ノットはヌル(累積確率)。ツリー= 5、結び目はヌル(累積確率)です。ツリー= 6、結び目はヌル(累積確率)です。ツリーの高さを求める

+0

わからない、多分[階層クエリ](https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315)を助けることができます君は。あなたがデータ組織の例、テーブル構造などを提供するならば、解決方法を理解しやすくなります。 – Seyran

+0

「確率を取る」とはどういう意味ですか?どのような確率?どのように計算されますか? – mathguy

+0

あなたの例では、確率はちょうど葉の値なので、私の答えの計算はうまくいきます。確率の本当の木を構築するならば、各ノードは確率も持っているはずです。@ MT0の答えは、各ノードに行く確率は等しく、定義された他の条件も正しくない場合。 – Seyran

答えて

0

次のようなデータを整理した場合、あなたは木、葉およびパスに関する詳細な情報を必要としない場合は、あなただけnodevalには等しい値treenodeがないかどうか確認することができ、次の

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; 

を行うことができますこのように、あなたが話している確率を仮定し

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

申し訳ありませんが、ツリーの長さに依存しない上記のツリー条件であることがわかりません。使用されたデータはサンプル用です。 – Seyran

0

は、各ブランチの等しい確率です:

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; 
出力

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 
関連する問題