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)
复制代码

 

 
posted @   zhjh256  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-01-20 一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结
2017-01-20 作为从业人员,如果一定要学一门新的编程语言,那么它一定是c++
点击右上角即可分享
微信分享提示