【发布时间】:2020-03-02 21:29:30
【问题描述】:
我有一组相关记录及其相关比率。不幸的是,并非所有比率都被捕获,而是可以从其他比率中得出。正如我可能需要 A -> D 的比率,但是我没有直接的比率可以参考,但我可以从下面的示例中通过 A->C (0.5) 和 C-> 的比率得出它D (3) 因此 0.5 * 3 = 1.5。或者我可以通过反转 A->B (1/2 = 0.5) 的比率来推导出 B,然后取 A->C (0.5) 的比率,因此 (1/2) * 0.5 = 0.25 依此类推.
例如
FROM_UNIT_ID TO_UNIT_ID RATIO
A B 2
A C 0.5
C D 3
我想要做的是计算所有可能路径及其比率的完整列表,如下所示。
FROM_UNIT_ID TO_UNIT_ID RATIO
A B 2
A C 0.5
C D 3
A D 1.5
B C 0.25
B D 0.75
B A 0.5
C A 2
C B 4
D A 0.666666667
D B 1.333333333
D C 0.333333333
使用下面的stack overflow question 我已经能够推导出一个口粮的所有同级以获得可能路径的列表,但是我无法调整这个查询来计算比率。我正在使用 Oracle 11g。
SELECT
CONNECT_BY_ROOT( FROM_UNIT_ID ) AS FROM_UNIT_ID,
TO_UNIT_ID
FROM (
SELECT FROM_UNIT_ID, TO_UNIT_ID, RATIO FROM RATIOS
UNION
SELECT TO_UNIT_ID, UNIT_ID, 1/RATIO AS RATIO FROM RATIOS
)
WHERE CONNECT_BY_ROOT( FROM_UNIT_ID ) <> TO_UNIT_ID
CONNECT BY NOCYCLE
PRIOR TO_UNIT_ID = FROM_UNIT_ID
ORDER BY FROM_UNIT_ID, TO_UNIT_ID;
【问题讨论】:
-
对于您的简单示例,没有冲突。但如果你的桌子上有
B C 10,答案会是什么? -
您的 Oracle 版本是 11g 还是只有 11gR2?后者有 CTE。
-
正如@TheImpaler 所说 - 这是我们必须知道您拥有的详细 Oracle 版本的一种情况。 11 还可以,但是 11.1 和 11.2 还是有很大区别的。当你
select banner from v$version时你看到了什么? -
Oracle 数据库 11g 版本 11.2.0.4.0
标签: sql oracle plsql oracle11g graph-algorithm