我有一个如下所示的数据集:
+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 2964 | 12814 | 4 |
| 0001 | 0002 | 0 |
| 7745 | 2964 | 0 |
| 0003 | 0004 | 0 |
| 0002 | 0005 | 6 |
| 12986 | 7745 | 0 |
+---------+---------+---------+
本质上,我在我想要的输出中寻找的是:
+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 12986 | 12814 | 4 |
+---------+---------+---------+
所以,本质上:
12986 在 7745 上加入,然后在 2964 上加入,得到 12814。其中 ColumnC 包含一个 > 0 的值。
我可以做到以上,但我的数据集可以达到数百万。所以这最终会导致太多的连接。我曾尝试使用 HANA 的hierarchy_descendants 函数。但我仍然没有得到想要的结果。我确实得到了级别,但我想要的是使用 ColumnA 中的 ID 来获取 columnB 中的相关 ID,其中 COLUMN
任何帮助,将不胜感激。
谢谢。
更新:
我知道我标记了SQL Server和Hana,但认为如果同时包含两者,我可以获得更多解决方案。就期望的结果而言,请参见以下内容:
+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 12986 | 12814 | 4 |
| 0001 | 0005 | 6 |
+---------+---------+---------+
所以我们必须双向走。
如果您使用 SQL Server 作为 DBMS,那么您可以使用这样的递归 CTE(公用表表达式),以便通过发生在ColumnA
和之间的分层步骤来获得所需的行ColumnB
:
WITH t2(ColumnA, ColumnB, ColumnC, level) AS
(
SELECT t1.*, 1
FROM t1 where ColumnA = '12986'
UNION ALL
SELECT t2.ColumnA, t1.ColumnB, t1.ColumnC, t2.level + 1
FROM t2
JOIN t1 on t1.ColumnA = t2.ColumnB
)
SELECT ColumnA, ColumnB, ColumnC
FROM t2
WHERE level = (SELECT MAX(level) FROM t2);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句