如何查找不同列排序的最后一个值

时间:2018-09-21 14:05:13

标签: powerbi dax powerbi-desktop

我有一个表MyTable包含列:QuoteID, ControlNo, Premium, ExpirationDate

我需要创建一个措施,以抓取SUM(Premium)EffectiveDate应该是<= Today(),最后一个ExpirationDate(按QuoteID DESC排序)应该是{ {1}}。

如何将以下语句转换为DAX?

在SQL中,我将这样做:

>= Today()

如何在DAX中编写它?

我已经尝试过了,但是不能正常工作:

select sum(Premium) as Premium
from MyTable t
where EffectiveDate <= GETDATE() and
      (select top 1 t2.ExpirationDate
       from MyTable t2
       where t2.ControlNo = t.controlno
       order by t.quoteid desc) >= GETDATE()

更新:

尝试从fact_Premium数据集创建计算表,但仍不确定如何过滤它

Premium =
CALCULATE (
    SUM ( fact_Premium[Premium] ),
    FILTER (
        fact_Premium,
        fact_Premium[EffectiveDate] <= TODAY () &&
        TOPN ( 1, ALL ( fact_Premium[ExpirationDate] ), 
                  fact_Premium[QuoteID], ASC ) >= TODAY ()
    )
)

1 个答案:

答案 0 :(得分:1)

这里的DAX有几个问题。

首先,当您使用TOPN时,排序表达式(第3个参数)只能引用您要操作的表中的行(第2个参数),因此仅使用[ExpirationDate]列将不会工作。我认为您可能希望使用fact_Premium而不是ALL ( fact_Premium[ExpirationDate] )

第二,TOPN函数返回一个表而不是单个值,因此您需要以某种方式访问​​想要的列。一种选择是使用像SUMXMAXX这样的迭代器:

MAXX( TOPN(...), fact_Premium[ExpirationDate] )

您还可以使用SELECTCOLUMNS来将单行单列表强制为一个值:

SELECTCOLUMNS( TOPN(...), "ExpirationDate", fact_Premium[ExpirationDate] )

我不能保证它会完美地工作,但是它应该使您更接近目标:

Premium =
CALCULATE (
    SUM ( fact_Premium[Premium] ),
    FILTER (
        fact_Premium,
        fact_Premium[EffectiveDate] <= TODAY () &&
        SUMX( TOPN ( 1, fact_Premium, fact_Premium[QuoteID], DESC ),
              fact_Premium[ExpirationDate] )
            >= TODAY ()
    )
)