Вы можете использовать row_number()
дважды, затем условное агрегирование:
select
no_records,
min(id) filter(where rn_asc = 1) first_id
max(id) filter(where rn_desc = 1) last_id
from (
select
id,
count(*) over() no_records
row_number() over(order by date asc) rn_asc,
row_number() over(order by date desc) rn_desc
from mytable
where date >= ? and date < ?
) t
where 1 in (rn_asc, rn_desc)
Знаки вопроса обозначают (включительно) начало и (исключение) конца интервала даты.
Из Конечно, если id
s постоянно увеличивается, достаточно простого агрегирования:
select count(*), min(id) first_id, max(id) last_id
from mytable
where date >= ? and date < ?