PowerBI DAX:如何创建计算列,当满足特定条件时其值会增加

问题描述 投票:0回答:1

我正在尝试在 DAX 中创建计算列 [NewCol]。每当 [Col1] 的先前值与当前行的值不同时,我都希望 NewCol 的值增加 1。如何在不引起循环依赖的情况下实现这一点?

索引 第 1 栏 新科
0 200 0
1 200 0
2 201 1
3 201 1
4 201 1
5 202 2
6 203 3
7 202 4
8 202 4

我知道这将创建一个新列 [Prv_Col1],它将获取 Col1 的先前值。

Prv_Col1 = 
    VAR current_row = 'Table1'[Col1]
    VAR previous_row = CALCULATE(MAX('Table1'[Col1]), FILTER('Table1', 'Table1'[Index] = EARLIER('Table1'[Index]) - 1))
    RETURN
        previous_row

这是 if 想要用来确定 NewCol 的值是否需要增加 1 的语句。

IF('Table1'[Col1]='Table1'[Prv_Col1], False, True)

我想避免创建列 [Prv_Col1],并且不知道如何在创建 [NewCol] 时增加自身,因为引用自身会导致循环依赖,因为该列尚不存在。

powerbi dax increment circular-dependency
1个回答
2
投票

尝试以下操作(添加注释以帮助解释其工作原理):

NewCol = 
  // an alternative to using EARLIER as it should be faster
  var thisIndex = [Index]

  // get all previous rows including this one
  var upToThisRow =
    FILTER(
      ALL('Table1'),
      'Table1'[Index] <= thisIndex 
    )

  // add a column to this virtual table with a 1 when value changes
  var addCheck = 
    ADDCOLUMNS(
      upToThisRow,
      "check", 
        var thisIndex = [Index]
        var previousValue = 
          CALCULATE(
            MIN('Table1'[Col1]),
              upToThisRow, 
              'Table1'[Index] = thisIndex - 1
            )
        return IF(NOT ISBLANK(previousValue ) && previousValue <> [Col1], 1)
    )
    
  // sum up
  return COALESCE(SUMX(addCheck, [check]), 0)

如果需要,这里与中间计算列相同(我正在与自己争论这是否会比上面的表现更好):

ValueChanged = // (intermediary)
  var thisIndex = [Index]
  var prevRowValue = 
    CALCULATE(
      MIN('Table1'[Col1]),
        REMOVEFILTERS(),
        'Table1'[Index] = thisIndex  - 1
    )
  return IF(NOT ISBLANK(prevRowValue) && prevRowValue <> [Col1], 1)


NewCol = 
  var thisIndex = [Index]
  var result =
    CALCULATE(
      SUM('Table1'[ValueChanged]),
      REMOVEFILTERS(),
      'Table1'[Index] <= thisIndex 
    )
  return COALESCE(result, 0)

NewCol
的其他版本,看看它们是否表现更好。

NewCol v1 = // added ValueChanged to the filter
  var thisIndex = [Index]
  var result =
    CALCULATE(
      SUM('Table1'[ValueChanged]),
      REMOVEFILTERS(),
      'Table1'[Index] <= thisIndex && [ValueChanged] = 1
    )
  return COALESCE(result, 0)


NewCol v2 =  // using COUNT instead of SUM
  var thisIndex = [Index]
  var result =
    CALCULATE(
      COUNT('Table1'[ValueChanged]),
      REMOVEFILTERS(),
      'Table1'[Index] <= thisIndex && [ValueChanged] = 1
    )
  return COALESCE(result, 0)


NewCol v3 =  // using COUNT with ALL
  var thisIndex = [Index]
  var result =
    CALCULATE(
      COUNTROWS('Table1'),
      REMOVEFILTERS(),
      'Table1'[Index] <= thisIndex && [ValueChanged] = 1
    )
  return COALESCE(result, 0)
© www.soinside.com 2019 - 2024. All rights reserved.