PostgreSQL limit的ties子句
给定如下数据:
id | name | salary |
1 | Alice | 2000 |
2 | Bob | 3000 |
3 | Charlie | 2000 |
4 | David | 2000 |
5 | Eddie | 1500 |
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS ONLY;
返回前两行数据,如下:
id | name | salary |
2 | Bob | 3000 |
1 | Alice | 2000 |
如果希望salary=2000的记录全部返回,可以使用TIES子句(结果好像不太对?),
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
其结果如下:
id | name | salary |
2 | Bob | 3000 |
1 | Alice | 2000 |
3 | Charlie | 2000 |
4 | David | 2000 |
否则就要使用DENSE_RANK分析函数,如下:
SELECT
c,
DENSE_RANK() OVER (
ORDER BY desc
) dense_rank_number
FROM
t
where dense_rank_number <= n // n为前几名
zjh@postgres=# explain analyze select * from (select a.*,dense_rank() over(order by name desc) dense_rank_number from movies a) x where x.dense_rank_number<=3; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------- Subquery Scan on x (cost=461344.97..551344.97 rows=1000000 width=28) (actual time=6119.130..9667.407 rows=900 loops=1) Filter: (x.dense_rank_number <= 3) Rows Removed by Filter: 2999100 -> WindowAgg (cost=461344.97..513844.97 rows=3000000 width=28) (actual time=6119.126..9341.719 rows=3000000 loops=1) -> Sort (cost=461344.97..468844.97 rows=3000000 width=20) (actual time=6118.989..6604.120 rows=3000000 loops=1) Sort Key: a.name DESC Sort Method: external merge Disk: 99864kB -> Seq Scan on movies a (cost=0.00..68281.00 rows=3000000 width=20) (actual time=0.014..506.638 rows=3000000 loops=1) Planning Time: 0.120 ms Execution Time: 9683.066 ms (10 rows) zjh@postgres=# explain analyze select * from movies order by name desc fetch first 3 rows with ties; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------- Limit (cost=107055.44..107055.45 rows=3 width=20) (actual time=5583.686..5583.781 rows=300 loops=1) -> Sort (cost=107055.44..114555.44 rows=3000000 width=20) (actual time=5583.684..5583.732 rows=301 loops=1) Sort Key: name DESC Sort Method: external merge Disk: 99864kB -> Seq Scan on movies (cost=0.00..68281.00 rows=3000000 width=20) (actual time=0.011..253.257 rows=3000000 loops=1) Planning Time: 0.095 ms Execution Time: 5600.186 ms (7 rows)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2017-01-20 一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结
2017-01-20 作为从业人员,如果一定要学一门新的编程语言,那么它一定是c++