Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 找到树的高度_Sql_Oracle_Hierarchical Data - Fatal编程技术网

Sql 找到树的高度

Sql 找到树的高度,sql,oracle,hierarchical-data,Sql,Oracle,Hierarchical Data,使用SQL,我希望遵循树结构直到最后一片叶子。 树=1,结=2;树=1,结=3;Tree=1,Knot=NULL(累积概率);树=2,结=4;树=2,结=5;Tree=2且结为空(累积概率);树=3,结=6;Tree=3且结为空(累积概率);Tree=4且结为空(累积概率);树=5,结为空(累积概率);Tree=6且结为空(累积概率) 如果像这样组织数据,可以执行以下操作 with TREETAB as ( select '1' treenode, '2' nodeval from dual u

使用SQL,我希望遵循树结构直到最后一片叶子。
树=1,结=2;树=1,结=3;Tree=1,Knot=NULL(累积概率);树=2,结=4;树=2,结=5;Tree=2且结为空(累积概率);树=3,结=6;Tree=3且结为空(累积概率);Tree=4且结为空(累积概率);树=5,结为空(累积概率);Tree=6且结为空(累积概率)

如果像这样组织数据,可以执行以下操作

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;
如果您不需要有关树、叶和路径的详细信息,您可以像这样检查
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 TREETAB t
 where not exists
 (select t.treenode from TREETAB t2 where t2.treenode = t.nodeval)

假设你所说的概率是每个分支的相等概率,那么:

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

不确定,也许能帮你。若你们提供你们的数据组织示例、表结构或其他一些东西,那个么你们将更容易理解解决方案。你们所说的“采取概率”是什么意思?什么可能性?它是如何计算的?在你的例子中,概率只是叶值,所以我的答案中的查询可以计算,如果建立一个真实的概率树,那么每个节点也应该有概率,@MT0的答案表明,如果我正确理解了他的代码,他假设到达每个节点的概率是相等的,如果没有定义其他条件也是正确的,“概率只是表格中的一列。”什么表格?您尚未显示表格。请为您的表和预期输出提供DDL和DML语句。图中没有解释算法-为什么输出中没有树4?库列是如何生成的?为什么,考虑到您的表结构,您不能只从概率不为空的表中选择*吗?对不起,我不明白您是否清楚这是树条件,上面的代码与树长度无关。使用的数据仅用于样本。