Postgres Запрос к базе данных, чтобы получить количество, а также первый и последний идентификаторы по дате в одном запросе - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть следующая структура БД.

table
-----
 id (uuids)
date (TIMESTAMP)

Я хочу написать запрос в postgres (на самом деле cockroachdb, который использует движок postgres, поэтому запрос postgres должен подойти).

Запрос должен возвращать количество записей между двумя датами, идентификатор записи с самой поздней датой и идентификатор записи с самой ранней датой в этом диапазоне.

Таким образом, запрос должен возвращать следующее: count, id (самая ранняя запись в диапазоне), id (самая последняя запись в диапазоне)

спасибо.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Вы можете использовать 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 < ?
1 голос
/ 16 апреля 2020

К сожалению, Postgres не поддерживает first_value() как функцию агрегирования. Одним из методов является использование массивов:

select count(*),
       (array_agg(id order by date asc))[1] as first_id,
       (array_agg(id order by date desc))[1] as last_id
from t
where date >= ? and date <= ?
...