PostgreSQL中如何获取窗口函数PARTITION分区的总行数
解决方法
你可以直接用COUNT(*)配合和行号相同的PARTITION BY规则作为窗口函数,就能直接拿到每个犬种分区的总记录数,同一个犬种下的所有行都会返回相同的总数值,不受你取前10条的过滤条件影响。
优化后的SQL示例
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY breed) AS row_number, COUNT(*) OVER (PARTITION BY breed) AS breed_total -- 新增字段,存储当前犬种的总记录数 FROM dogs ) t WHERE row_number BETWEEN 1 AND 10
说明
- 窗口函数的执行优先级高于外层的WHERE过滤,所以子查询内的
COUNT(*)统计的是每个犬种分区的全量数据行数,不会因为外层只取前10条就只统计10条 - 如果你只需要特定犬种比如Staffies的总数量,直接在结果里筛选该犬种的任意一行,取
breed_total字段的值即可,也可以单独执行下面的SQL快速查询:
SELECT COUNT(*) FROM dogs WHERE breed = 'Staffies'
- 相比你原来的子查询JOIN写法,上面的单表子查询写法省去了JOIN操作,执行效率更高,语法也更简洁。
内容的提问来源于stack exchange,提问作者baash05
相关产品推荐
相关产品推荐

