По сути, есть два способа получить это
select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
select s.rec_id
from payments s
where s.customer_id='IHS050018' and s.dc_number = p.dc_number
order by s.rec_id desc
limit 1);
Также, если вы хотите получить последний баланс для каждого покупателя, которого вы можете сделать
select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
select s.rec_id
from payments s
where s.customer_id=p.customer_id and s.dc_number = p.dc_number
order by s.rec_id desc
limit 1);
То, что я считаю по существу другим способомиспользует тот факт, что select rec_id с order by desc и limit 1 эквивалентно выбору max (rec_id) с соответствующей группой by, в полном объеме:
select p.rec_id, p.customer_id, p.dc_number, p.balance
from payments p
where p.rec_id IN (
select max(s.rec_id)
from payments s
group by s.customer_id, s.dc_number
);
Это должно быть быстрее (если вы хотите последний балансдля каждого клиента), поскольку max обычно дешевле, чем sort (с индексами он может быть одинаковым).
Кроме того, при такой записи подзапрос не коррелируется (его не нужно запускать для каждой строкивнешний запрос), что означает, что он будет выполнен только один раз, и весь запрос может быть переписан как объединение.
Также обратите внимание, что было бы полезно написать его как коррелированный запрос (добавив, где s.customer_id = p.customer_id и s.dc_number = p.dc_number во внутреннем запросе) в зависимости от селективности внешнего запроса,
Это может улучшить производительность, если вы ищете последний баланс только в одну или несколько строк.