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

How to find the last value ordered by a different column

我有一个 table MyTable 有列:QuoteID, ControlNo, Premium, ExpirationDate

我需要创建一个度量来获取 SUM(Premium)EffectiveDate 应该是 <= Today(),最后一个 ExpirationDate(按 QuoteID DESC 排序)应该成为 >= Today().

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

在SQL,我会这样做:

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()

如何在 DAX 中写入?

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

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

更新:

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

In_Force Premium = 
    FILTER(
        ADDCOLUMNS(
        SUMMARIZE(
           //Grouping necessary columns
            fact_Premium,
            fact_Premium[QuoteID],
            fact_Premium[Division],
            fact_Premium[Office],
            dim_Company[CompanyGUID],
            fact_Premium[LineGUID],
            fact_Premium[ProducerGUID],
            fact_Premium[StateID],
            fact_Premium[ExpirationDate]
                  ),    
            "Premium", CALCULATE(
                                SUM(fact_Premium[Premium])
                                ),
            "ControlNo", CALCULATE(
                            DISTINCTCOUNT(fact_Premium[ControlNo])
                                  )

   ), // Here I need to make sure TODAY() falls between fact_Premium[EffectiveDate] and (SELECT TOP 1 fact_Premium[ExpirationDate] ORDE BY QuoteID DESC)
    )

这里的 DAX 有几个问题。

首先,当您使用 TOPN 时,您的排序表达式(第三个参数)只能引用您正在操作的 table 中的行(第二个参数),因此只能使用 [ExpirationDate] 列将不起作用。我想你可能想要 fact_Premium 而不是 ALL ( fact_Premium[ExpirationDate] ).

其次,TOPN 函数 returns 一个 table 而不是单个值,因此您需要以某种方式访问​​您想要的列。一种选择是使用像 SUMXMAXX:

这样的迭代器
MAXX( TOPN(...), fact_Premium[ExpirationDate] )

您也可以使用 SELECTCOLUMNS 将单行单列 table 强制为一个值:

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 ()
    )
)