使用时间切片器获取最新结果的动态计数

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

正如您在下面的数据集中看到的,只有 4 个唯一的 ID,但是它们每个都有多行不同的版本。我试图完成的是创建一个测量行数的度量,但仅限于基于切片器的最新版本 ID 的结果。

因此,这些将是基于切片器选择的正确结果:

  • 2024 年 4 月 1 日:1
    open
    项目 (55)
  • 5/15/2024:2
    open
    (55,77) 和 1
    closed
    (66)
  • 8/1/2024: 2
    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
    调暗设置为整数,并且 不总结(我认为这是正确的?)
  • 版本之间可能存在差距,例如 1..3,但它们始终会依次与修改的关系更大(即,在具有相同 ID 的较低版本之前不会修改 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
powerbi dax
1个回答
0
投票

正如评论中提到的,我错误地处理了这个问题,并最终在数据到达 PBI 之前通过利用 M-Language/Power Query 与 Dax 达成了解决方案。

我的一个关键的过失是,我只在状态在

OPEN
CLOSED
之间切换时进行计算。因此,我可以通过过滤掉重复的项目(例如 ID = Look)来过滤掉无意义的数据(例如状态未更改的重复 ID(例如 ID 77 版本 1 → 2)),从而简化流程。

我用来解决上述示例数据的源代码如下,采用 M 语言格式,但我将总结我所做的事情。

  • 按 ID 对数据进行排序,然后进行 MODIFIED 或 Modified(没关系
  • 添加索引参数并检查先前ID和状态与当前行相同的项目。如果为真,则过滤掉。
  • 为未清项目添加了
    OPEN
    计算列,如果打开
    +1
    如果关闭
    -1
  • 创建了一个
    Closed
    计算列,但这比较棘手,因为我需要再次查找以前的记录以查看同一 ID 的状态是否已从 CLOSED 更改为 OPEN,在这种情况下会减少已关闭的项目计数(请参阅 ID 88)
  • 我取消了这两列的透视,然后我得到了一个更清晰的数据集。
  • 进入 PBI 后,我使用
    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

M 公式解决方案

这可能会被清理掉,但我的姻亲要求我的孩子们玩 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"
© www.soinside.com 2019 - 2024. All rights reserved.