正如您在下面的数据集中看到的,只有 4 个唯一的 ID,但是它们每个都有多行不同的版本。我试图完成的是创建一个测量行数的度量,但仅限于基于切片器的最新版本 ID 的结果。
因此,这些将是基于切片器选择的正确结果:
open
项目 (55)open
(55,77) 和 1 closed
(66)open
(88, 55) 和 2 closed
(77,66)身份证 | 版本 | 已修改 | 状态 |
---|---|---|---|
88 | 1 | 2024 年 6 月 11 日 | 打开 |
88 | 2 | 2024 年 6 月 22 日 | 已关闭 |
88 | 4 | 2024 年 7 月 15 日 | 打开 |
88 | 6 | 2024 年 8 月 5 日 | 已关闭 |
77 | 1 | 2024 年 5 月 6 日 | 打开 |
77 | 2 | 2024 年 5 月 25 日 | 打开 |
77 | 5 | 2024 年 7 月 15 日 | 已关闭 |
66 | 1 | 2024 年 4 月 15 日 | 打开 |
66 | 3 | 2024 年 5 月 12 日 | 已关闭 |
55 | 1 | 2024年2月28日 | 打开 |
55 | 2 | 2024 年 3 月 28 日 | 打开 |
Version
和 ID
调暗设置为整数,并且 不总结(我认为这是正确的?)如果我使用下面的 Dax 函数,其中包含硬编码的日期变量
dMax
,我将根据该 dMax
变量获得我想要的数据表的准确输出。但是,当我尝试将其纳入我的数据视觉效果时,使 dMax
动态化(如注释掉的行所示),它包含了所有内容。我知道 Calculate 应该考虑上下文成员,但是当我执行诸如Calculate(countRows(daxTable),///several filter attempts\)之类的操作时,我不断收到错误或不正确的计算。最终,我只是希望能够计算此构建的 dax 表中显示的行数,但是,我怀疑有一种比完全重新创建表更有效的方法来做到这一点?谢谢你。
daxTable =
//VAR dMax = MAX('Calendar'[Date])--cannot tie this to slicer?
VAR dMax = DATE(2024,6,1) -- ← this works as hard coded, but cannot get to slicer
VAR FilteredTable =
FILTER('sampleTable',
'sampleTable'[Modified] <= dMax
)
var correctManualResult =
FILTER(FilteredTable,CALCULATE(MAX('sampleTable'[Version]),
'sampleTable'[Modified] = MAXX(FILTER(FilteredTable, 'sampleTable'[ID] = EARLIER('sampleTable'[ID])), 'sampleTable'[Modified]))>0)
RETURN
correctManualResult
正如评论中提到的,我错误地处理了这个问题,并最终在数据到达 PBI 之前通过利用 M-Language/Power Query 与 Dax 达成了解决方案。
我的一个关键的过失是,我只在状态在
OPEN
和 CLOSED
之间切换时进行计算。因此,我可以通过过滤掉重复的项目(例如 ID = Look)来过滤掉无意义的数据(例如状态未更改的重复 ID(例如 ID 77 版本 1 → 2)),从而简化流程。
我用来解决上述示例数据的源代码如下,采用 M 语言格式,但我将总结我所做的事情。
OPEN
计算列,如果打开 +1
如果关闭 -1
Closed
计算列,但这比较棘手,因为我需要再次查找以前的记录以查看同一 ID 的状态是否已从 CLOSED 更改为 OPEN,在这种情况下会减少已关闭的项目计数(请参阅 ID 88) AllItems = CALCULATE(SUM('StatusTable'[Value]))
,它按预期显示了项目。希望这对其他人有帮助。
个人笔记今天是美国的感恩节,我确实喜欢感恩节这个概念(就像真的一样......我去过印度,有些人/孩子真的过得很艰难😕!)。然而,在美国的某个地方,这个假期发生了错误,无论房主(我)说什么,姻亲们都可以邀请自己过来……是不是很糟糕,我觉得在上面闲聊更舒服技术挑战与走出我的家庭办公室到家庭战区形成鲜明对比,在那里我一定会遇到烦人的姻亲和傻瓜兄弟姐妹......???哦,太好了,我还以为只有我一个呢! 感恩节快乐 StackOverflow!
这是输入 Power BI 的内容
ID Version Modified Status Value
55 1 2/28/2024 Open 1
66 1 4/15/2024 Open 1
66 3 5/12/2024 Open -1
66 3 5/12/2024 Closed 1
77 1 5/6/2024 Open 1
77 5 7/15/2024 Open -1
77 5 7/15/2024 Closed 1
88 1 6/11/2024 Open 1
88 2 6/22/2024 Open -1
88 2 6/22/2024 Closed 1
88 4 7/15/2024 Open 1
88 4 7/15/2024 Closed -1
88 6 8/5/2024 Open -1
88 6 8/5/2024 Closed 1
这可能会被清理掉,但我的姻亲要求我的孩子们玩 UNO,我不能让他们在没有支持的情况下忍受,所以必须离开。
let
cClose = "Closed",
ooOpen = "Open",
startTable=
Table.FromRecords({
[ID = 88, Version = 1, Modified = #date(2024,06,11), Status = ooOpen],
[ID = 88, Version = 2, Modified = #date(2024,06,22), Status = cClose],
[ID = 88, Version = 4, Modified = #date(2024,07,15), Status = ooOpen ],
[ID = 88, Version = 6, Modified = #date(2024,08,05), Status = cClose ],
[ID = 77, Version = 1, Modified = #date(2024,05,06), Status = ooOpen],
[ID = 77, Version = 2, Modified = #date(2024,05,25), Status = ooOpen],
[ID = 77, Version = 5, Modified = #date(2024,07,15), Status = cClose],
[ID = 66, Version = 1, Modified = #date(2024,04,15), Status = ooOpen],
[ID = 66, Version = 3, Modified = #date(2024,05,12), Status = cClose],
[ID = 55, Version = 1, Modified = #date(2024,02,28), Status = ooOpen],
[ID = 55, Version = 2, Modified = #date(2024,03,28), Status = ooOpen]
}),
setTypes = Table.TransformColumnTypes(startTable,{{"Version", Int64.Type},
{"ID", Int64.Type},{"Modified", type date}, {"Status", type text}}),
#"Sorted Rows" = Table.Sort(setTypes,{{"ID", Order.Ascending},{"Modified",Order.Ascending}}),
#"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1, Int64.Type),
fixColumnOrder = Table.ReorderColumns(#"Sorted Rows" ,{"ID", "Status", "Version", "Modified"}),
checkColMatches = let
zTable = fixColumnOrder,
zIDList = Table.Column(zTable,"ID"),
zStatusList = Table.Column(zTable,"Status"),
addIndex = Table.AddIndexColumn(zTable, "Index", 0, 1, Int64.Type),
testResult = Table.AddColumn(addIndex, "CheckForMatches", each
if [Index] = 0 then false else
if zIDList{[Index]-1} = [ID] then zStatusList{[Index]-1} = [Status] else false, type logical),
endResult = Table.RemoveColumns(testResult,{"Index"})
in
endResult,
#"Filtered Rows" = Table.SelectRows(checkColMatches, each ([CheckForMatches] = false)),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"CheckForMatches"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", ooOpen, each if [Status] = ooOpen then 1 else -1, Int64.Type),
createClosedIncludingDoOvers =
let
zTable = #"Added Custom",
idListAgain = Table.Column(zTable,"ID"),
plusIndex = Table.AddIndexColumn(zTable,"Index",0,1,Int64.Type),
AddedClosedItems = Table.AddColumn(plusIndex, cClose, each if [Status] = cClose then 1 else if [Index] = 0 then 0 else if (idListAgain{[Index]-1} = [ID]) and ([Status] = "Open") then -1 else 0 ,Int64.Type)
in
Table.RemoveColumns(AddedClosedItems,{"Index"}),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(createClosedIncludingDoOvers, {"ID", "Status", "Version", "Modified"}, "Items", "Value"),
RemovedZeros = Table.SelectRows(#"Unpivoted Columns", each ([Value] <> 0)),
#"Removed Columns1" = Table.RemoveColumns(RemovedZeros,{"Status"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns1",{{"Items", "Status"}})
in
#"Renamed Columns"