Отвлекаясь от ответа Гордона, я думаю, это то, что вы хотите:
SELECT (
date_trunc('month', current_date) - interval '1 day' -
(case extract(dow from date_trunc('month', current_date) - interval '1 day')
when 0 then 2
when 6 then 1
else 0
end) * interval '1 day'
)::date as last_weekday_in_last_month;
Предположим, ваши выходные - 0 (воскресенье) и 6 (суббота). Он использует оригинальную логику OP, чтобы найти последнюю дату последнего месяца, а затем логику Гордона CASE
, чтобы вычесть больше дней, если последняя дата равна 0 или 6.