如何在 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
的分页扩展性不佳。考虑:
我正在使用 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
的分页扩展性不佳。考虑: