Forum Discussion

davidap's avatar
davidap
Advocate I
2 years ago
Solved

DAX Retrieve value from another row and column within table based on matching criteria

Problem
New Column Aggregate ID should return the Index ID where the User matches and Paid Date is between the First and Last Service dates of an Index ID. The Index ID marks a major event with Aggregate ID marking other services.

 

Solution I created in the End

1) Create a table with deduplicate Index ID and Paid amounts, add a column flagging the highest paid

2) Query against it

 

Aggregate ID = maxx (filter(aggregateIdTable, transactionTable[User] = aggregateIdTable[User] && transactionTable[Paid Date] >= aggregateIdTable[First Service] && transactionTable[Paid Date] <= aggregateIdTable[Last Service] && aggregateIdTable[Is Paid Amount Max?] = "Yes"), aggregateIdTable[Index Id])

 

 

Data

UserStoreFirst Service  Last Service  Paid Date  PaidIndex IDAggregate ID
A67801B9/1/20239/1/20239/1/2023118.0  
A67801C9/2/20239/2/20239/2/2023177.0  
A67801A9/1/20239/2/20239/2/2023153.0A67801-A-9/1/2023-9/2/2023 
C94823A9/4/20239/4/20239/4/2023189.0A67801-A-9/4/2023-9/4/2023 
  • Hi, davidap 

     

    You can try the following methods.

    Aggregate ID = 
    CALCULATE ( MAX ( 'Table'[Index ID] ),
        FILTER (ALLEXCEPT( 'Table','Table'[User]),
            [Paid Date] >= 'Table'[First Service] 
                && [Paid Date] <= 'Table'[Last Service] 
        )
    )

    Is this the result you expect? Please see the attached document.

    Best Regards,

    Community Support Team _Charlotte

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

5 Replies

  • v-zhangti's avatar
    v-zhangti
    Community Support

    Hi, davidap 

     

    You can try the following methods.

    Aggregate ID = 
    CALCULATE ( MAX ( 'Table'[Index ID] ),
        FILTER (ALLEXCEPT( 'Table','Table'[User]),
            [Paid Date] >= 'Table'[First Service] 
                && [Paid Date] <= 'Table'[Last Service] 
        )
    )

    Is this the result you expect? Please see the attached document.

    Best Regards,

    Community Support Team _Charlotte

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

    • davidap's avatar
      davidap
      Advocate I

      This was closest to what I used in the end. I added a column determine whether the Index had the max $ amount to break ties.

  • Hi,

    Try this calculated column formula

    Column = CALCULATE(MAX(Data[Index ID]),FILTER(Data,Data[User]=EARLIER(Data[User])&&Data[First Service  ]<=EARLIER(Data[Paid Date  ])&&Data[Last Service  ]>=EARLIER(Data[Paid Date  ])))

    Hope this helps.

     

  • Thanks all. I built a solution last night that put a deduplicated list User, First/Last Service Dates, and the Index IDs (minus blanks) into another table then did CALCULATE+FILTER to pull in the value in the User and Paid dates were within spans. I also assigned Index IDs to those with the highest $ on those dates, in case multiple indices were found.