Dynamic Grouping with Ranking is duplicating Customers

Context is the key here.

Are you totally understand what the top 10 is at each different context (or result) in the table?

That is the key to understanding the behaviour here.

When you place the quarterly context in the matrix you are now working out the top 10 in each different quarter, not the overall top 10 from the beginning of time.

The way to work these out is to break the formula down. When looking just at the ranking you’ll see it shows a greater spread of ranks for customers

What needs to be done here is to remove filters from the date table, which I did with the below

So to me the matrix looks correct. It is just that some of your customers appear in the top 10 only occasionally in each quarter and then are in your other group some other quarters.

This is where understanding the context well is crucial and then also how your formula reacts to it.

To get the overall top 10 no matter the date context you need something like this.

Then I took this back into the grouping formula

Customer Sales by Group (All) =
VAR OverallRanking = [Customer Ranking]

RETURN
CALCULATE( [Total Sales],
    FILTER( VALUES( Customer[Customer Names] ),
       COUNTROWS(
           FILTER( 'Customer Groups',
               OverallRanking > 'Customer Groups'[Min]
               && OverallRanking <= 'Customer Groups'[Max] ) )
      > 0 ))