如何在 postgresql 中获取分区的总行数

How does one get the total rows for a partition in 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)

每个品种给我 ~10 只狗..

不过我需要的是计数。有没有办法获取分区的计数。我想知道我有多少员工在等待领养。

我确实注意到有一个百分比,我发现的所有文档似乎都表明有一个叫做总行数的东西。但是我没看到。

只是 运行 window 聚合函数 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;

还删除了不必要的连接并进行了简化。
参见:

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

的情况下更改结果

此外,使用 LIMIT / OFFSET 的分页扩展性不佳。考虑: