【问题标题】:Power BI Dax - Trying to break circular dependency after one attemptPower BI Dax - 一次尝试后试图打破循环依赖
【发布时间】:2021-12-29 16:37:24
【问题描述】:

我正在尝试找出我拥有的数据中的祖先血统。我觉得我缺少一些东西来完成这项工作。此数据不会更改,因此不确定在加载/刷新数据时是否遗漏了可以在电源查询编辑器中编写的内容。

虽然从技术上讲,它在字段中是循环的,但它永远不会返回它当前所在的同一行,并且第一代是硬数字作为起点。只想参考妈妈和爸爸来推算孩子的血统。第一代是基本的 IF() 语句。以下是我在遇到循环依赖错误之前所能得到的。我尝试了一些方法来打破它认为它会循环。

逻辑是:

  1. 根据出生地,第一代的每个血统都是 100%,之后的每一代都是 ((母亲血统 + 父亲血统) / 2)。我发现我可以使用 PATHITEM() 来隔离血液类型,但会出现循环依赖的错误。 (这是我无法弄清楚如何参考母亲/父亲进行计算的地方。)如果我把这部分拿出来,我会得到下面的图片适用于第一代,而正确的母亲/父亲适用于第二代。
Asisa Blood = 
VAR current_id = 'Sheet1'[ID]
VAR current_gen = 'Sheet1'[Generation]
VAR current_blood = 'Sheet1'[Birthplace]
VAR current_mother_blood = 
    PATHITEM(
    CALCULATE(
        DISTINCT('Sheet1'[Mother's Blood Mix]),
        FILTER(
            ALLNOBLANKROW('Sheet1'[ID]),
            'Sheet1'[ID] = current_id
        ),
        REMOVEFILTERS('Sheet1')
    ),1,INTEGER)
VAR current_father_blood = 
    PATHITEM(
    CALCULATE(
        DISTINCT('Sheet1'[Father's Blood Mix]),
        FILTER(
            ALLNOBLANKROW('Sheet1'[ID]),
            'Sheet1'[ID] = current_id
        ),
        REMOVEFILTERS('Sheet1')
    ),1,INTEGER)
VAR gen1_value = 100

RETURN
    IF(AND(LOWER(current_gen) = "1",LOWER(current_blood) = "asisa"),
    gen1_value,
    ((current_mother_blood + current_father_blood)/2)
    )
  1. Blood Mix 将四种血型连接到一个字段中,以便在下一步中查找。
Blood mix = 
VAR current__id = 'Sheet1'[ID]
VAR current_blood_a = 'Sheet1'[Asisa Blood]
VAR current_blood_b = 'Sheet1'[Africa Blood]
VAR current_blood_c = 'Sheet1'[Europe Blood]
VAR current_blood_d = 'Sheet1'[North America Blood] 

RETURN
    current_blood_a & "|" & current_blood_b & "|" & current_blood_c & "|" & current_blood_d
  1. Mother 和 Father 正在查找带有母亲或父亲 ID 的血液混合物
Mother's Blood Mix = 
VAR current_id = 'Sheet1'[ID]
VAR current_gen = 'Sheet1'[Generation]
VAR gen_value = 'Sheet1'[Blood mix]
VAR current_parent_id = 
    IF(LOWER(current_gen) = "1",current_id,'Sheet1'[Mother ID])
VAR result = 
    CALCULATE(
        DISTINCT('Sheet1'[Blood mix]),
        FILTER(
            ALLNOBLANKROW('Sheet1'[ID]),
            'Sheet1'[ID] = current_parent_id
        ),
        REMOVEFILTERS('Sheet1')
    )
RETURN
    result

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    您可以尝试这样做(相当消耗资源):

    新栏目:

    heritage_Father = PATH(Blood[ID],(Blood[FatherID]))
    heritage_Mother = PATH(Blood[ID],(Blood[MotherID]))
    Mancestor = LOOKUPVALUE(Blood[heritage_Mother],Blood[ID],Blood[FatherID]) &"|"& Blood[heritage_Mother]
    Fancestor = LOOKUPVALUE(Blood[heritage_Father],Blood[ID],Blood[MotherID])&"|"&Blood[heritage_Father]
    

    新措施:

    ASIA_check = 
    VAR Table0 =
        SELECTCOLUMNS(
        ADDCOLUMNS (
            GENERATE (
                ROW ( "Text", "0"&SELECTEDVALUE(Blood[Fancestor]) ),
                VAR TokenCount =
                    PATHLENGTH ( [Text] )+1
                RETURN
                    GENERATESERIES ( 1, TokenCount )
            ),
            "Word", PATHITEM ( [Text], [Value] )
        ),
        "Word",VALUE([Word]))
    VAR Table1 =
        SELECTCOLUMNS(
        ADDCOLUMNS (
            GENERATE (
                ROW ( "Text", "0"&SELECTEDVALUE(Blood[Mancestor]) ),
                VAR TokenCount =
                    PATHLENGTH ( [Text] )+1
                RETURN
                    GENERATESERIES ( 1, TokenCount )
            ),
            "Word", PATHITEM ( [Text], [Value] )
        ),
        "Word",VALUE([Word]))
    RETURN
    DIVIDe(
    if(SELECTEDVALUE(Blood[Generation]) <> 1,
      calculate(sum(Blood[AsiaBlood]), FILTER(ALL(Blood), Blood[ID] in  Table0 || Blood[ID] in Table1)),0
    ),
    (POWER(2, SELECTEDVALUE(Blood[Generation])-1)))
    
    AFRICA_check = 
    VAR Table0 =
        SELECTCOLUMNS(
        ADDCOLUMNS (
            GENERATE (
                ROW ( "Text", "0"&SELECTEDVALUE(Blood[Fancestor]) ),
                VAR TokenCount =
                    PATHLENGTH ( [Text] )+1
                RETURN
                    GENERATESERIES ( 1, TokenCount )
            ),
            "Word", PATHITEM ( [Text], [Value] )
        ),
        "Word",VALUE([Word]))
    VAR Table1 =
        SELECTCOLUMNS(
        ADDCOLUMNS (
            GENERATE (
                ROW ( "Text", "0"&SELECTEDVALUE(Blood[Mancestor]) ),
                VAR TokenCount =
                    PATHLENGTH ( [Text] )+1
                RETURN
                    GENERATESERIES ( 1, TokenCount )
            ),
            "Word", PATHITEM ( [Text], [Value] )
        ),
        "Word",VALUE([Word]))
    RETURN
    DIVIDe(
    if(SELECTEDVALUE(Blood[Generation]) <> 1,
      calculate(sum(Blood[AfricaBlood]), FILTER(ALL(Blood), Blood[ID] in  Table0 || Blood[ID] in Table1)),0
    ),
    (POWER(2, SELECTEDVALUE(Blood[Generation])-1)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2021-12-31
      相关资源
      最近更新 更多