代码之家  ›  专栏  ›  技术社区  ›  Serdia

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

  •  1
  • Serdia  · 技术社区  · 6 年前

    我有一张桌子 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 ()
        )
    )
    

    更新:

    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)
        )
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Alexis Olson    6 年前

    这里的DAX有几个问题。

    TOPN ,您的排序表达式(第3个参数)只能引用您正在操作的表中的行(第2个参数),因此只能使用 [ExpirationDate] 那里的柱子不起作用。我想你可能想要 fact_Premium ALL ( fact_Premium[ExpirationDate] ) .

    第二,市场 函数返回一个表而不是单个值,因此需要以某种方式访问所需的列。一种选择是使用迭代器,比如 SUMX MAXX

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