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 <= ?
我有以下数据库结构。
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 <= ?