Postgres DB 查询以在单个查询中按日期获取计数、第一个和最后一个 ID

Postgres DB query to get the count, and first and last ids by date in a single query

我有以下数据库结构。

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

我想在 postgres 中写一个查询(实际上是使用 postgres 引擎的 cockroachdb,所以 postgres 查询应该没问题)。

查询应该return 2 个日期之间的记录计数、最晚日期记录的 ID 和该范围内最晚最早日期记录的 ID。

所以查询应该return如下: count, id(范围内最早记录的), id(范围内最新记录的)

谢谢。

可以使用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一直在增加,简单聚合就足够了:

select count(*), min(id) first_id, max(id) last_id
from mytable
where date >= ? and date < ?

遗憾的是,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 <= ?