自行联接表,直到“被淘汰”

时间:2018-08-17 16:58:48

标签: sql database powerbi dax self-join


我正在寻找一种方法(使用SQL或DAX)将表与自身进行自我连接,直到其无效为止。

一个示例可能是描述问题的最简单方法: 假设我们有一个像这样的参考表:

Name    Next Youngest Sibling
Aaron   Nicole
Nicole  Bobby

由此,我想产生一个可以使该表变平的联接,如下所示:

Name    Next Sibling    Next X 2 Sibling    Next x 3 Sibling
Aaron   Nicole          Bobby               Null
Nicole  Bobby           Null                Null
Bobby   Null            Null                Null

很明显,这可以通过3个手动联接来完成,但是我正在寻找一种使之动态化的方法,以便它产生所需的许多“ Next x X”列,以使表中的每一行都为“ Null”。结果集。

谢谢,
马特

2 个答案:

答案 0 :(得分:3)

这可以通过DAX中的PATH() and PATHITEMREVERSE()函数来完成。

results

要获取每一行的完整路径:

All Names = PATH(People[Name], People[Next Youngest Sibling])

将以竖线(|)分隔的字符串;并且在这种情况下,这是相反的顺序,因为同级概念与默认的父子概念相反。

要获取Next SiblingNext X 2 Sibling

Next Sibling = PATHITEMREVERSE(People[All Names], 2)
Next X 2 Sibling = PATHITEMREVERSE(People[All Names], 3)

将在路径字符串的右侧执行查找。

限制:表中还需要存在末端节点,因此,额外的Bobby, Bobby行;否则PATH()函数将返回错误。

答案 1 :(得分:1)

此后,您必须进行数据透视,但是您可以按照DAX中的以下几行创建此形式的柱状形式:

web

这假设您已向原始Nulled = ADDCOLUMNS( CROSSJOIN( VALUES(Siblings[Name]), SELECTCOLUMNS(GENERATESERIES(1, COUNT(Siblings[Name])), "Nth", [Value])), "Sibling", LOOKUPVALUE(Siblings[Name], Siblings[Rank], [Nth] + RANK.EQ([Name], Siblings[Name], ASC)), "Column", IF([Nth] = 1, "Next", "Next x " & [Nth]) & " Sibling") 表中添加了Rank列。


这里的关键是进行交叉联接以获取所需的表大小,然后定义Siblings

Unpivoted

如果将null转换为空字符串,则此方法在矩阵视觉效果很好,其中Sibling在行上,Name在列上。 (在不替换空值的情况下,视觉效果将不会显示最后一行或最后一列,因为它们都是空白。)

Matrix Visual