Explanation
At the core, this formula is simply an INDEX formula that retrieves the value in an array at a given position. The value for n is supplied in column H, and all the "heavy" work that the formula does is to figure out the row from which to retrieve a value, where row corresponds to "nth" match.
The IF function does the work of figuring out which rows contain a match, and the SMALL function returns the nth value from that list. Inside of IF, the logical test is:
ids=id
which yields this array:
{TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE}
Note the customer id matches at the 1st and 4th positions, which appear as TRUE. The "value if true" argument in IF generates a list of relative row numbers with this expression:
ROW(ids)-ROW(INDEX(ids,1,1))+1
which produces this array:
{1;2;3;4;5;6;7}
This array is then "filtered" by the logical test results, and the IF function returns the following array result:
{1;FALSE;FALSE;4;FALSE;FALSE;FALSE}
Note we have valid row numbers for row 1 and row 2.
This array is then processed by SMALL, which is configured to use values in column H to return "nth" values. The SMALL function automatically ignores the logical values TRUE and FALSE in the array. In the end, the formulas reduce to:
=INDEX(amts,1) // I6, returns $150
=INDEX(amts,4) // I7, returns $125
Handling errors
Once there are no more matches for a given id, the SMALL function will return a #NUM error. You can handle this error with the IFERROR function, or by adding logic to count matches and abort processing once the number in column H is greater than the match count. The example here shows one approach.
Multiple criteria
To add multiple criteria, you use boolean logic, as explained in this example.