PowerPivot DAX - 每组动态排名(每组最小值)

Posted

技术标签:

【中文标题】PowerPivot DAX - 每组动态排名(每组最小值)【英文标题】:PowerPivot DAX - Dynamic Ranking Per Group (Min Per Group) 【发布时间】:2013-03-22 10:52:36 【问题描述】:

我正在寻找一种在 Microsoft PowerPivot 2010 中使用的方法,该方法允许我执行动态排名,该方法将根据应用的过滤器和切片器值自动更新相关的排名值。 p>

到目前为止,我看到的所有示例都使用了 Calculate() DAX 函数,该函数通过 All() 函数覆盖 PowerPivot 表中的现有过滤器,这会导致用户可能应用的预定义过滤器被忽略。

为了说明我的要求,请参考以下示例:

(PowerPivot 窗口中的源数据:)

-------------------------------------------------------------------------------------
Claim Number | Claimant Number | Transaction Date |            Dollar Amount
------------------------------------------------------------------------------------
ABCD123456            4                1/1/2012                   $145.23
ABCD123456            4                8/1/2012                   $205.12
ABCD123456            4                9/1/2012                   $390.74
VDSF123455            2                3/5/2012                   $10.12
VDSF123455            2                9/5/2012                   $50.12           
VDSF123455            2                12/9/2012                  $210.45
------------------------------------------------------------------------------------------

现在,我希望能够根据第一个交易日期仅显示每个索赔编号和索赔人编号的美元金额。我基本上希望只显示与每个索赔#和索赔人编号组相关的第一笔交易相关的美元。

我的想法是为每个 [索赔编号 + 索赔人编号] 组创建一个动态排名,类似于“partition by - Row_Number()”函数。这样,每个包含排名值 1 的 [索赔编号 + 索赔人编号] 组将代表与该值相关的第一个交易。

但是,如果用户对生成的数据透视表中的数据应用过滤器,我需要更改此排名值。

这可以根据上面定义的示例数据说明如下:

----------------------------------------------------------------------------------------------
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank |
---------------------------------------------------------------------------------------------
 ABCD123456             4                1/1/2012         $145.23        1
 ABCD123456             4                8/1/2012         $205.12        2
 ABCD123456             4                9/1/2012         $390.74        3
 VDSF123455             2                3/5/2012         $10.12         1
 VDSF123455             2                9/5/2012         $50.12         2  
 VDSF123455             2               12/9/2012         $210.45        3
 ------------------------------------------------------------------------------------------------

现在,如果用户通过切片器或通过数据透视表或 PowerPivot 表本身中的过滤器下拉列表应用过滤器,不包括

(已应用过滤器)

=============================================================================
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank |
============================================================================
ABCD123456           4                 8/1/2012           $205.12       1
ABCD123456           4                 9/1/2012           $390.74       2
VDSF123455           2                 3/5/2012           $10.12        1
VDSF123455           2                 9/5/2012           $50.12        2  
VDSF123455           2                12/9/2012          $210.45        3
===========================================================================

如您所见,根据用户应用的过滤器,基于与索赔编号 ABCD123456 相关联的行被隐藏,第一个索赔组的排名值自动更新。

然后,我想在 PowerPivot 表中创建一个额外的度量,该度量将仅显示与包含排名值为 1 的交易相关的美元金额,如下所示:

(已应用过滤器,已添加新措施)

===============================================================================================
Claim Number | Claimant Number | Transaction Date |  Dollar Amount |  Rank | Opening Dollar Amt|
================================================================================================
ABCD123456          4                 8/1/2012          $205.12         1         $205.12
ABCD123456          4                 9/1/2012          $390.74         2        
VDSF123455          2                 3/5/2012          $10.12          1         $50.12
VDSF123455          2                 9/5/2012          $50.12          2 
VDSF123455          2                 12/9/2012         $210.45         3

================================================ ================================================

然后可以参考此数据创建相应的数据透视表,以便“期初美元金额”度量仅代表与上述每组第一笔交易相关的美元。

如果有人能概述如何实现这一点,我将不胜感激。

我认为动态排名方法可能是一个好主意,但如果有人有更好的主意来实现我的最终结果/目标,即简单地获得与第一笔交易“可见”相关的美元金额(基于任何用户都应用了过滤器)每个组我都会对您可能采用的任何方法持开放态度。

【问题讨论】:

【参考方案1】:

虽然这是一个写得很好的问题,你显然已经花时间来制定,你应该read this about cross posting in forums。这与您同时在 MSDN 上发布的内容明显重复。我已经回答了两个都认为这是一个不错的问题。

首先,我创建了一个基本度量 [Amount] 来汇总美元金额列。然后我在 RANKX() 中使用它来创建以下内容:

[Rank] = RANKX(
         FILTER(
         ALLSELECTED(Table1),Table1[Claimant Number]=max(Table1[Claimant Number])
                   ),
         [Amount],
            ,1)

关键是 [Amount] 度量被迭代的表 - ALLSELECTED() 只是将当前过滤器上下文中的内容发挥作用,而 FILTER() 中的表达式将表限制为当前的索赔编号。

之后,根据[Rank]是否为1返回[Amount]是一个简单的任务:

[Opening Balance] = if([Rank]=1,[Amount],BLANK())

希望这是有道理的,如果他们有帮助,我会将我的工作发布到 SkyDrive。

雅各布

【讨论】:

很抱歉打开这个旧帖子,但是如果排名是按该字段排序的,为什么您没有明确使用交易日期?我正在尝试解决同样的问题。

以上是关于PowerPivot DAX - 每组动态排名(每组最小值)的主要内容,如果未能解决你的问题,请参考以下文章

DAX函数大全

DAX 中没有 QUARTER()?真的吗?

每组每 x 行排名

数据可视化之DAX篇(二十二)一文搞懂Power BI中的排名问题

获取每组最高/最小 <whatever> 的记录

POWER BI DAX函数应用-筛选器函数(上)