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

时间:2013-04-01 11:00:49

标签: min powerpivot dax rank

我正在搜索在 Microsoft PowerPivot 2010 中使用的方法,这将允许我执行动态排名,该排名将根据应用的过滤器和切片器值自动更新关联的排名值。

因此,我见过的所有示例都使用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
------------------------------------------------------------------------------------------

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

我的思考过程是为每个[索引号+索赔号]组创建一个动态排名,类似于“分区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表本身应用过滤器,则不包括评估日期<在2012年2月1日,排名值应自动更新并反映如下:

(已应用过滤器)

=============================================================================
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

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

然后可以创建一个相应的数据透视表来引用这些数据,这样“开元美元”指标只会代表与上述每组FIRST交易相关的美元。

如果有人可以概述如何实现这一目标,我将不胜感激。

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

1 个答案:

答案 0 :(得分:3)

虽然这是一个写得很好的问题,你显然已经花时间进行制定,但你应该read this about cross posting in forum。这是您在MSDN上完全同时发布的内容的明确重复。我已经回答这两个问题都是一个不错的问题。

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

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

键是[Amount]度量迭代的表 - ALLSELECTED()只是将当前过滤器上下文中的内容置于播放状态,而FILTER()中的表达式将表限制为当前声明号。 / p>

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

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

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

雅各