Variant 1: select features to keep
Use Select by expression
with this expression (screenshot 1):
column_a = minimum (column_a, group_by:=column_b)
Then export/save only the selected features and you're done. You get a new layer, the original data remains unchanged. All attributes for the minimum value of column A are retained (your request in a comment to the solution by @Pigreco - see screenshot 2)
Or: You could also Invert selection
(click the icon, see screenshot 1) and delete the duplicates. All attributes for the minimum value of column A are retained (your request in a comment to the solution by @Pigreco - see screenshot 2).
Variant 2: select features to delete
An even faster way (no need to invert selection): directly select the duplicates you want to delete with one of these modifications of the expression. Then delete the selected features. No new layer is created, the initial data is changed, duplicates are irrevocably deleted:
replace =
by <>
:
column_a <> minimum (column_a, group_by:=column_b)
replace =
by !=
:
column_a = minimum (column_a, group_by:=column_b)
- tribute to @pigreco
add not
in front of the expression (screenshot 2):
not column_a = minimum (column_a, group_by:=column_b)
screenshot 1:

screenshot 2, including column_c that is retained - selected lines (blue) can be deleted, red ones will be kept:
