首页 > 数据库 >PostgreSQL中 FETCH FIRST ... WITH TIES 是查询结果中限制返回的行数

PostgreSQL中 FETCH FIRST ... WITH TIES 是查询结果中限制返回的行数

时间:2024-06-21 15:59:34浏览次数:13  
标签:salary ... PostgreSQL nameinfo 50000 TIES FETCH FIRST

在 PostgreSQL 中,FETCH FIRST … WITH TIES 是一个在查询结果中限制返回的行数,但同时确保与最后一行具有相同排序值的所有行都被包括进来的子句。这通常与 ORDER BY 子句一起使用。

当您使用 FETCH FIRST n ROWS ONLY 时,您只会得到前 n 个排序后的行。但是,如果您希望包括与第 n 个行具有相同排序值的所有行(即“并列”的行),则可以使用 WITH TIES。

FETCH FIRST … WITH TIES 是 SQL 2008 标准的一部分,并且在 PostgreSQL 13 及更高版本中可用。如果您使用的是更早版本的 PostgreSQL,您将需要使用不同的方法来达到相同的效果,例如使用LIMIT … OFFSET … , 窗口函数或子查询。

以下是一个简单的示例来说明这一点:

假设我们有一个名为 t_employees 的表,其中包含员工的姓名和薪水:

CREATE TABLE t_employees (  
    nameinfo varchar(32),  
    salary numeric  
);  
  
INSERT INTO t_employees (nameinfo , salary) VALUES  
('user001', 50000),  
('devj001', 50000),  
('mscs001', 45000),  
('sqlp001', 45000),  
('gsql001', 40000);

pgdb01=# select * from t_employees;
 nameinfo | salary 
----------+--------
 user001  |  50000
 devj001  |  50000
 mscs001  |  45000
 sqlp001  |  45000
 gsql001  |  40000
(5 rows)

如果我们想找到薪水最高的前两个员工,但希望包括所有薪水一样名次并列的员工,我们可以这样做:

pgdb01=# select nameinfo,salary from t_employees ORDER BY salary DESC FETCH FIRST 1 ROWS WITH TIES;
 nameinfo | salary 
----------+--------
 user001  |  50000
 devj001  |  50000
(2 rows)

由于 user001 和 devj001 的薪水都是 50000(并列第一),且使用了WITH TIES,相同排序值的所有行都被包括结果中

pgdb01=# select nameinfo,salary from t_employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
 nameinfo | salary 
----------+--------
 user001  |  50000
 devj001  |  50000
(2 rows)

在这里插入图片描述

pgdb01=# select nameinfo,salary from t_employees ORDER BY salary DESC FETCH FIRST 3 ROWS WITH TIES;
 nameinfo | salary 
----------+--------
 user001  |  50000
 devj001  |  50000
 mscs001  |  45000
 sqlp001  |  45000
(4 rows)

由于 user001 和 devj001 的薪水都是 50000(并列第一),并且 mscs001和 sqlp001的薪水都是 45000(并列第二),因此上述查询将返回 user001 、devj001 、mscs001和 sqlp001的信息。

如果使用LIMIT … OFFSET … 不会像 FETCH FIRST … WITH TIES 那样包含并列的行,出现间隙gap

pgdb01=# select nameinfo,salary from t_employees ORDER BY salary DESC LIMIT 3;
 nameinfo | salary 
----------+--------
 user001  |  50000
 devj001  |  50000
 mscs001  |  45000
(3 rows)

明显的sqlp001信息并返回在结果集中。此时gap就出现了,返回结果并非预期结果。

结合使用

虽然 FETCH FIRST … WITH TIES 和 LIMIT … OFFSET … 是不同的功能,但在某些情况下,您可能想要结合使用它们来达到特定的目的。但是,PostgreSQL 并不直接支持在一个查询中同时使用这两个子句。相反,您可能需要使用子查询或窗口函数来达到类似的效果。

例如,如果您想使用 WITH TIES 进行分页,您可能需要先确定每页的“边界”值(即每页最后一行的排序值),然后在外部查询中使用这个值来过滤结果。这通常涉及到更复杂的查询和逻辑。

总的来说,选择使用 FETCH FIRST … WITH TIES 还是 LIMIT … OFFSET … 取决于您的具体需求。如果您需要处理并列值并包括它们在内,那么 FETCH FIRST … WITH TIES 是更好的选择。如果您只是简单地需要限制返回的行数或进行分页,那么 LIMIT … OFFSET … 就足够了。

标签:salary,...,PostgreSQL,nameinfo,50000,TIES,FETCH,FIRST
From: https://blog.csdn.net/zxrhhm/article/details/139859465

相关文章

  • 我为什么要转行做大模型?钱多、活少、下班早....
    最近研究了一下大模型相关的内容,决定从互联网的推荐算法转行做大模型推理工程化相关的工作。所以简单说说我在这个决定中的思考过程。1.推荐算法岗的现状我本来是一个在大厂做推荐算法的工程师。收入在行业里面算是中游水平,就这么一直干着似乎也没什么问题。但是互联......
  • 若依框架页面新增时,富文本加入图片保存时出现:JSON parse error: Unexpected character
    在使用若依框架的富文本框新增时,如果插入一个图片的时候会出现一个JSONparseerror:Unexpectedcharacter('/'(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature'ALLOW_COMMENTS'notenabledforparser);nestedexceptioniscom.fas......
  • 全是坑!!从 MySQL 到 PostgreSQL【送源码】
    0、前言原项目框架SpringBoot+ MybatisPlus +Mysql1、切换流程1.1、项目引入postgresql驱动包由于我们要连接新的数据库,理所当然的要引入该数据库的驱动包,这与mysql驱动包类似<dependency>    <groupId>org.postgresql</groupId>    <artifactId>postgresq......
  • linux配置reids集群,一直wait......(解决办法)
    如果一直wait…[root@localhostmyredis]#systemctlstartfirewalld[root@localhostmyredis]#firewall-cmd--staterunning[root@localhostmyredis]#firewall-cmd--zone=public--add-port=16379/tcp--permanentsuccess[root@localhostmyredis]#systemctlr......
  • postgresql简单使用
    postgresql.conf#系统、数据库配置文件pg_hha.conf#客户机连接文件pg_ctl和pgsql一、pg_ctl服务管理命令pg_ctl是PostgreSQL提供的控制服务启动、停止、重启等操作的命令行工具。常用选项和示例命令 选项 描述 示例启动PostgreSQL服务 start 启动数据库服......
  • 一书即可通关LLM大模型!成功通关大模型,看这1本足够了... (附PDF)
    哈喽大家好!最近有粉丝朋友喊我推荐一些大模型的学习书籍,我给大家推荐这么一本书,基于gbt3、gbt4等transform架构的自然语言处理。这是一本对transform工作原理感兴趣的人必读的书籍。亚马逊的评分是九点七分,内行人在睡不着的时候恨不得把全书都背诵完毕。本书的写作目的是......
  • Docker部署安装应用大集合(Tomcat、Nginx、Mysql、Redis、MQ、Nacos、Zookeeper、Port
    Docker部署安装应用大集合(Tomcat、Nginx、Mysql、Redis、MQ、Nacos、Zookeeper、Portainer、MongoDB......) 精选 原创CodeDevMaster2022-11-1608:42:24博主文章分类:Docker©著作权文章标签dockermysqlNginxNacosMQ文章分类Docker云计算yyds干货盘点 Docker部署......
  • SQLite vs MySQL vs PostgreSQL对比总结
    开发业务系统时,是绕不开RDBMS(关系型数据库)的。虽然现在诞生了各种NoSQL的数据库,RDBMS在业务系统中的严谨和优势依然无法取代。近几年大大小小的项目中,常用的三种RDBMS(SQLite,MySQL,Postgres)都有多次接触过,一些使用心得记录如下,供大家参考。1.SQLiteSQLite是一个独立的、基于文件......
  • 2024 Scrum Day 敏捷大会演讲嘉宾阵容升级,早鸟票预售中...
    ​关于ScrumDay智驭未来,敏捷先行——2024中国Scrum大会启航在全球数字化转型的浪潮中,敏捷已成为企业脱颖而出的关键。Scrum中文网携手全球敏捷行业巨擘——Scrum.org联袂呈现年度敏捷盛会ScrumDay,将于今秋盛大启幕!大会聚焦“AI时代下的敏捷(AgileintheAIAge)”,汇集......
  • [论文速览] Small-scale proxies for large-scale Transformer training instabilitie
    Pretitle:Small-scaleproxiesforlarge-scaleTransformertraininginstabilitiessource:ICLR2024paper:https://arxiv.org/abs/2309.14322code:ref:小尺度Transformer如何ScaleIdea这篇文章想通过小模型来研究大模型(Transformer)训练不稳定的原因Method(Model)图......