If you’ve tried a DAX MIN with a filter like CALCULATE(MIN(Sales[Sales]), Sales[Region] = “East”) in a table by region, you’ve probably seen the same $49 on every row, even Central and West.
That’s not a bug. The CALCULATE filter replaces the Region filter that each row brings. Wrap the condition in KEEPFILTERS when you want the row’s filter kept, or use MINX with FILTER when the minimum is a row-by-row calculation.
In this tutorial, we’ll build every dax min with filter pattern on one sales table: plain MIN per region, CALCULATE, KEEPFILTERS, two conditions, a value filter and MINX with FILTER.
Each number below is what Power BI Desktop showed me, so you can check your results against mine.
The Sample Sales Data We’ll Use
My demo file is a CSV with 60 orders from 01/12/2026 to 09/09/2026, loaded with Home > Get data > Text/CSV into a table named Sales. It has OrderID, OrderDate, Region, City, State, ZIP, Category, Product, SalesRep, Quantity and Sales.
East has 32 orders, West 15, South 10 and Central 3. These are the rows that decide the results below:
| OrderID | OrderDate | Region | City | Category | Product | SalesRep | Qty | Sales |
|---|---|---|---|---|---|---|---|---|
| SO-1014 | 01/21/2026 | East | Portland, ME | Accessories | Wireless Mouse | Tyler Brooks | 1 | $49 |
| SO-1036 | 06/20/2026 | Central | Chicago, IL | Accessories | Wireless Mouse | Marcus Hale | 3 | $147 |
| SO-1018 | 08/10/2026 | South | Dallas, TX | Accessories | Wireless Mouse | Brian Keller | 3 | $147 |
| SO-1060 | 04/28/2026 | West | Denver, CO | Monitors | ProArt 32 | Marcus Hale | 1 | $689 |
| SO-1046 | 06/12/2026 | East | Boston, MA | Laptops | Surface Laptop 7 | Rachel Morgan | 1 | $1,299 |
| SO-1032 | 09/09/2026 | East | Boston, MA | Laptops | ThinkPad X1 | Rachel Morgan | 4 | $5,796 |
| SO-1003 | 02/24/2026 | West | Seattle, WA | Laptops | Surface Laptop 7 | Brian Keller | 5 | $6,495 |
| SO-1020 | 01/12/2026 | West | Phoenix, AZ | Software | Visio Plan 2 | Rachel Morgan | 8 | $1,440 |
Watch the tiny $49 mouse order in East. It’s the lowest sale in the whole file, so any measure that loses the Region filter ends up showing $49.
Every measure here starts the same way. On the Home ribbon, select New measure in the Calculations group, type the formula in the formula bar and press Enter. If you keep a lot of measures, a dedicated measure table in Power BI keeps them tidy.

I then set each measure’s format to Currency with 0 decimals on the Measure tools ribbon and dropped Region plus all six measures into a Table visual.
Min Value per Category or Region: Plain MIN Already Does It
Before adding any filter, look at what MIN does on its own. It returns the smallest value in the column, inside whatever the visual is already filtering.
Lowest Sale = MIN(Sales[Sales])
On the same Sales table, that gives Central $147, East $49, South $147, West $689 and a Total of $49.

How does this work?
Each table row filters Sales to one region, so MIN only sees that region’s orders. West’s cheapest order is the $689 ProArt 32 monitor, and the Total row has no region filter, so it shows the $49 mouse.
So if you want the power bi min value per category, put Category on the rows and use plain MIN. You don’t need CALCULATE for that. The Power BI DAX MIN function guide covers MIN on dates and text too.
Method 1: DAX MIN With a Filter Using CALCULATE (Recommended)
Use this when you want one fixed slice, such as the lowest East sale, no matter what else the visual shows. It’s the pattern I use for cards and KPI tiles.
Here’s the formula:
Lowest East Sale = CALCULATE(MIN(Sales[Sales]), Sales[Region] = "East")
Same table by Region. The new column reads $49 on every row, including Central, South, West and the Total.

How does this work?
CALCULATE evaluates MIN(Sales[Sales]) after applying Sales[Region] = “East”. Microsoft’s docs say that when a column already has a filter, the new filter overwrites it.
The West row arrives with Region = West. CALCULATE throws that away and puts Region = East in its place, so every row asks the same question and gets the same $49 from order SO-1014.
Important: this is exactly what you want on a card, and exactly what you don’t want in a table split by the same column. The MAX version behaves the same way, as I showed in DAX MAX with filter.
Method 2: Keep the Row Filter With KEEPFILTERS
Use KEEPFILTERS when the measure sits in a visual that’s already sliced by the filtered column and you want blanks outside the slice instead of a repeated value.
Lowest East Sale (Keep Filters) = CALCULATE(MIN(Sales[Sales]), KEEPFILTERS(Sales[Region] = "East"))
Now only the East row shows $49. Central, South and West are blank, and the Total still reads $49.

How does this work?
KEEPFILTERS adds the East filter to the row’s filter instead of replacing it. Power BI uses the intersection of the two.
On the West row, that’s West AND East, which matches no orders, so MIN returns blank. On the East row, it’s East AND East, so you get $49. The Total row has no region filter, so only East applies.
If you need the opposite, a measure that ignores a filter on purpose, see how to remove filters in Power BI DAX with ALL and ALLEXCEPT.
Method 3: MIN With Multiple Filters
You can pass more than one condition to CALCULATE. Every condition has to be true, just like AND.
Lowest East Laptop Sale = CALCULATE(MIN(Sales[Sales]), Sales[Region] = "East", Sales[Category] = "Laptops")
Same Sales table, now limited to East laptops. Every row shows $1,299, the Surface Laptop 7 that Rachel Morgan sold in Boston on 06/12/2026.

How does this work?
Both filters go into one CALCULATE, so Power BI only looks at rows where Region is East and Category is Laptops. Because Region is replaced again, the Central and West rows show the East laptop value too.
Wrap only the Region condition in KEEPFILTERS if you want the other rows blank. The same multi-condition CALCULATE pattern works for counts, as in Power BI count if true measures.
Method 4: Filter by Value (Lowest Sale Over $5,000)
Sometimes the filter is on the same column you’re taking the minimum of. Say you want the smallest large order, anything over $5,000:
Lowest Sale Over 5000 = CALCULATE(MIN(Sales[Sales]), Sales[Sales] > 5000)
East shows $5,796 and West shows $6,495. Central and South are blank, and the Total is $5,796.

How does this work?
This filter is on Sales[Sales], not on Region. CALCULATE only overwrites filters on the columns you name, so each row keeps its Region filter.
East’s smallest order above $5,000 is SO-1032, a ThinkPad X1 order for $5,796. West’s is SO-1003 for $6,495. Central and South have no order above $5,000, so MIN returns blank.
Here’s the catch: a blank isn’t zero, so the Central and South cells stay empty. The Power BI DAX MAX function post shows the two-argument form you can use to set a floor value.
Method 5: DAX MINX With FILTER for a Row-by-Row Minimum
MIN only reads a column. When the value you want doesn’t exist as a column, such as price per unit, use MINX. It calculates an expression for each row of a table and returns the lowest result.
Lowest West Unit Price = MINX(FILTER(Sales, Sales[Region] = "West"), DIVIDE(Sales[Sales], Sales[Quantity]))
On the same table by Region, the West row and the Total show $180. Every other row is blank.

How does this work?
FILTER(Sales, Sales[Region] = “West”) returns only the West orders that are visible in the current row. DIVIDE then works out Sales / Quantity for each one, and MINX keeps the lowest.
$180 is Visio Plan 2. Two West orders tie at that price: SO-1020 ($1,440 for 8) and SO-1050 ($900 for 5). MINX returns the value once and doesn’t tell you which order it came from.
Unlike Method 1, FILTER doesn’t replace the row’s filter. On the Central row, Sales only holds Central orders, so FILTER finds no West rows and the result is blank. That’s why power bi minx with FILTER behaves like KEEPFILTERS here.
Pro Tip: When a simple column condition does the job, use it inside CALCULATE instead of FILTER. Microsoft recommends avoiding FILTER as a filter argument, and the Boolean form is easier to read.
Which Method Should You Use?
Here’s how I pick, based on the results from the same Sales table:
| You want | Use | Result in the demo |
|---|---|---|
| Lowest value per row (category, region) | MIN(Sales[Sales]) | $147 / $49 / $147 / $689 |
| One fixed slice for a card or KPI | CALCULATE(MIN(…), Sales[Region] = “East”) | $49 on every row |
| The slice only where the row matches | CALCULATE(MIN(…), KEEPFILTERS(…)) | $49 on East, blank elsewhere |
| Two or more conditions | CALCULATE(MIN(…), cond1, cond2) | $1,299 on every row |
| Minimum above or below a value | CALCULATE(MIN(…), Sales[Sales] > 5000) | $5,796 East, $6,495 West |
| Minimum of a calculation | MINX(FILTER(…), expression) | $180 on West only |
If you’re not sure, start with Method 1 on a card and Method 2 in a table or matrix.
Things to Keep in Mind
- Same value on every row: the CALCULATE filter replaced the row’s filter on that column. Wrap it in KEEPFILTERS.
- Blank instead of a number: no row matched every filter. That’s correct, so decide whether a card should show a default.
- Boolean filters can’t use measures: Sales[Sales] > 5000 works, but a condition on a measure needs FILTER over a table.
- MIN on dates: MIN also returns the earliest date. To get another column from that first-date row, follow Power BI DAX MIN date examples.
- MINX skips blanks: rows where the expression is blank are ignored, and DIVIDE returns blank when Quantity is 0.
For more DAX patterns with real numbers, browse the Power BI tutorials on SPGuides.
If you’re building more min and max measures, these walkthroughs pick up where this one stops:
Frequently Asked Questions
How do I use MIN with a filter in DAX?
Wrap MIN in CALCULATE and add the condition, for example CALCULATE(MIN(Sales[Sales]), Sales[Region] = “East”). Add more conditions separated by commas; all of them must be true.
Why does my CALCULATE MIN show the same value on every row?
The filter in CALCULATE replaces the row’s filter on the same column, so every row is evaluated for that one value. Use KEEPFILTERS around the condition to keep the row’s filter.
What’s the difference between MIN and MINX in Power BI?
MIN returns the smallest value in one column. MINX evaluates an expression for each row of a table, such as Sales divided by Quantity, and returns the lowest result.
How do I use DAX MINX with a filter?
Pass FILTER as the table argument: MINX(FILTER(Sales, Sales[Region] = “West”), DIVIDE(Sales[Sales], Sales[Quantity])). FILTER keeps the visual’s own filters, so other regions show blank.
Where does Microsoft explain KEEPFILTERS?
The KEEPFILTERS function reference explains that CALCULATE filters replace the current context while KEEPFILTERS adds to it, with a worked example.

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.