首页 > 解决方案 > 如何在 postgresql 中获取分区的总行数

问题描述

我正在使用 Windows 函数来帮助我对数据库中的记录列表进行分页。

例如,我有一个狗列表,它们都有与之相关的品种。我想向我的用户展示每个品种的 10 只狗。

所以那将是

select * from dogs 
join (
SELECT id, row_number() OVER (PARTITION BY breed) as row_number FROM dogs
) rn on dogs.id = rn.id
where (row_number between 1 and 10)

那会给我〜每个品种的十只狗..

我需要的是一个计数。有没有办法获取分区的数量。我想知道我有多少员工在等待收养。

我确实注意到有一个百分比,我发现的所有文档似乎都表明存在所谓的总行数。但我没有看到。

标签: sqlpostgresqlcountpaginationecto

解决方案


count()只需在同一分区上运行窗口聚合函数(不添加ORDER BY!)即可获得分区的总数:

SELECT *
FROM  (
   SELECT *
        , row_number() OVER (PARTITION BY breed ORDER BY id) AS rn
        , count() OVER (PARTITION BY breed) AS breed_count          -- !
   FROM   dogs
   ) sub
WHERE  rn < 11;

还删除了不必要的连接并简化了。
看:

我添加ORDER BY到框架定义中row_number()以获得确定性结果。没有,Postgres 可以自由返回任意 10 行。任何对表(或等)的写入VACUUM都可以并且将在没有ORDER BY.

LIMIT此外,使用/的分页OFFSET不能很好地扩展。考虑:


推荐阅读