Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
6 years ago
Solved

Earliest Date Calculations

I need a quick bit of help on Power BI. Consider a table showing Customer/Contracts and the dates those contracts were signed – a bit like this:

 

Customer/Contract

Date

Sky-ABC123

2018-06

Sky-ABC124

2018-06

Sky-ABC123

2019-06

 

The problem is that we need to identify how many new were signed in each month.    So in the above table Sky signed 2 new contracts in June 2018 but zero new ones in June 2019 as that is a renewal.  Required output is below.    Really we just needs a way to distinguish renewals from new – which can be done by finding the earliest date for each distinct customer/contract.   I could manage this in SQL easily enough but have no idea how to do it in PowerBI.  Can someone guide how to do this in PowerBI?

 

Month

New Contracts

2018-06

2

2019-06

0

  • Mariusz's avatar
    Mariusz
    6 years ago

    Hi Anonymous 

     

    Sure,

    CALCULATED modifies Filter Context
    TREATAS applies context on Table Date and filters it to only __minDate Value

    KEEPFILTERS ensures the value is not calculated for 01/06/2019 as no new contracts there.

     

    You could simplify this syntax  and remove TREATAS like below

    VAR __minDate = 
    CALCULATE( 
        MIN( 'Table'[Date] ), 
        ALL( 'Table' ), 
        VALUES( 'Table'[Customer/Contract] ) 
    )
    RETURN 
    CALCULATE(
        COUNTROWS( 'Table' ),
        KEEPFILTERS( 'Table'[Date] = __minDate )
    ) + 0

     

    Learn more about

    TREATAS - https://www.sqlbi.com/blog/marco/2017/11/25/using-treatas-in-place-of-in-in-dax/
    KEEPFILTERS - https://www.sqlbi.com/articles/using-keepfilters-in-dax/


    Best Regards,
    Mariusz

    If this post helps, then please consider Accepting it as the solution.


4 Replies

  • Mariusz's avatar
    Mariusz
    Community Champion

    Hi Anonymous 

     

    Try this

    Measure = 
    VAR __minDate = 
    CALCULATE( 
        MIN( 'Table'[Date] ), 
        ALL( 'Table' ), 
        VALUES( 'Table'[Customer/Contract] ) 
    )
    RETURN 
    CALCULATE(
        COUNTROWS( 'Table' ),
        KEEPFILTERS( TREATAS( { __minDate }, 'Table'[Date] ) )
    ) + 0
    Best Regards,
    Mariusz

    If this post helps, then please consider Accepting it as the solution.

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      Mariusz  Thanks for your quick reply, Could you please explain little bit in details how we are calcualting this measure, especially this part of the formula, I am quite new in DAX and trying to understand what does this part of DAX is:

      CALCULATE(
          COUNTROWS( 'Table' ),
          KEEPFILTERS( TREATAS( { __minDate }, 'Table'[Date] ) )
      ) + 0

       

       

      • Mariusz's avatar
        Mariusz
        Community Champion

        Hi Anonymous 

         

        Sure,

        CALCULATED modifies Filter Context
        TREATAS applies context on Table Date and filters it to only __minDate Value

        KEEPFILTERS ensures the value is not calculated for 01/06/2019 as no new contracts there.

         

        You could simplify this syntax  and remove TREATAS like below

        VAR __minDate = 
        CALCULATE( 
            MIN( 'Table'[Date] ), 
            ALL( 'Table' ), 
            VALUES( 'Table'[Customer/Contract] ) 
        )
        RETURN 
        CALCULATE(
            COUNTROWS( 'Table' ),
            KEEPFILTERS( 'Table'[Date] = __minDate )
        ) + 0

         

        Learn more about

        TREATAS - https://www.sqlbi.com/blog/marco/2017/11/25/using-treatas-in-place-of-in-in-dax/
        KEEPFILTERS - https://www.sqlbi.com/articles/using-keepfilters-in-dax/


        Best Regards,
        Mariusz

        If this post helps, then please consider Accepting it as the solution.