我正在尝试在 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] 时增加自身,因为引用自身会导致循环依赖,因为该列尚不存在。
尝试以下操作(添加注释以帮助解释其工作原理):
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)