Я думаю, вам нужна оконная функция, скорее всего RANK()
скажем, у вас есть таблица заказов
order_id | cust_id | transaction_time |
select
CONCAT(Year(transaction_date), '-', rank() over (partition by cust_id, year(transaction_date) order by transaction_date desc, id)) as invoice_number
, order_id
, cust_id
, transaction_time
from orders
, чтобы обеспечить если у вас нет дублирующего номера счета на одного клиента, вы должны убедиться, что заказ нарушает любые связи.