sql - 如何在 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)
那会给我〜每个品种的十只狗..
我需要的是一个计数。有没有办法获取分区的数量。我想知道我有多少员工在等待收养。
我确实注意到有一个百分比,我发现的所有文档似乎都表明存在所谓的总行数。但我没有看到。
解决方案
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
不能很好地扩展。考虑:
推荐阅读
- gcc - 软件流水线的真实示例代码
- flutter - 当设备具有 Chrome 以外的默认浏览器时,Flutter ChromeSafariBrowser 无法启动
- java - 对象到泛型类型转换
- python - 没有现成的服务副本 - azure aks
- github - 如何为 GitHub 存储库中的部分代码着色?
- c - 不能在代码中间定义和声明数组吗?
- github - GitHub 是否会在一段时间后删除没有活动的存储库?
- discord - On_message 命令不允许其他命令工作
- typescript - 为 monaco-editor 集成执行 mocha 测试
- sql-server - 将表在 join 子句中但不在 group 子句中的字段求和