postgresql分页查询和OVER的用法

分页查询

分页查询需要返回指定范围的数据和总数据量,用下面的sql语句可以一次查询到。

select count(1) over() ,* from companies where pk>2 order by pk desc limit 3 offset 2

返回值是[{8,company1},{8,company2},{8,company3}]。
数据库一共10条数据,where条筛选出8条,limit后剩下3条。
可以看出执行顺序是where–>select–>limit,和以前的认识一样。

分组查询

根据不同的pk和状态分组,计算每组的数据条数。
distinct必须放在select项目的最前面,distinct a,b就是distinct a,distinct b的效果(distinct a,distinct b会报错)。
注意count(1),count(left_table_pk)和count(right_table_pk)的区别:
count(1)始终大于0,因为如果没有数据就不会出现该条。
左连接时,如果left_table对应的right_table没有数据时,count(left_table_pk)大于0,count(right_table_pk)可能为0。
在这里插入图片描述

select DISTINCT mst_companies.company_pk,FOO.UK, FOO.STATUS1,
	COUNT(foo.uk) OVER(PARTITION BY mst_companies.company_pk,STATUS1) c1,COUNT(foo.uk) OVER(PARTITION BY UK) c2 from
mst_companies left join
	(SELECT USER_PK UK,
	(CASE WHEN study_start_dt IS NULL THEN 1 
	WHEN study_start_dt IS not NULL AND study_end_dt IS NULL THEN 2
	WHEN study_start_dt IS not NULL AND study_end_dt IS NOT NULL  AND TEST_start_dt IS NULL THEN 3
	WHEN study_start_dt IS not NULL AND study_end_dt IS NOT NULL  AND TEST_start_dt IS NOT NULL  AND TEST_END_dt IS NULL THEN 4
	WHEN study_start_dt IS not NULL AND study_end_dt IS NOT NULL  AND TEST_start_dt IS NOT NULL  AND TEST_END_dt IS NOT NULL THEN 5 END) AS STATUS1
            FROM trn_seminar_statuS) FOO on mst_companies.company_pk=foo.uk
order by company_pk desc,status1 asc
PostgreSQL 是一种强大的开源关系型数据库管理系统,支持多种高级特性,包括分页查询分页查询主要用于处理大量数据集的情况,允许系统返回一系列有限数量的结果,并通过特定的顺序(如升序、降序等)组织结果。 ### PostgreSQL 分页查询的基本语法 在 PostgreSQL 中,分页通常使用 `LIMIT` 和 `OFFSET` 关键字完成。基本语法如下: ```sql SELECT * FROM table_name ORDER BY column_name [ASC | DESC] LIMIT number_of_results OFFSET offset_value; ``` 其中: - `table_name`: 需要从其获取数据的表名。 - `column_name`: 数据排序依据的列名。 - `[ASC | DESC]`: 指定排序方式,分别为升序和降序。 - `number_of_results`: 每次查询返回的记录数。 - `offset_value`: 跳过的初始记录数目,用于控制起始位置。 例如,如果我们有一个名为 `employees` 的表,并希望按照员工名称的字母顺序显示前50条数据,则可以使用下面的 SQL 查询: ```sql SELECT * FROM employees ORDER BY name ASC LIMIT 50 OFFSET 0; ``` ### 动态生成 SQL 查询 当需要基于用户输入或其他动态条件构建分页查询时,可以使用变量或函数来生成上述查询字符串。这有助于提高代码的灵活性和可维护性。例如,在编写一个 PHP 脚本与 PostgreSQL 进行交互时: ```php $limit = 50; // 每页显示的记录数 $pageNumber = $_GET['page'] ?? 1; // 当前页面编号,默认为第一页 $offset = ($pageNumber - 1) * $limit; $query = "SELECT * FROM employees ORDER BY name ASC LIMIT :limit OFFSET :offset"; $stmt = $pdo->prepare($query); $stmt->bindParam(':limit', $limit); $stmt->bindParam(':offset', $offset); $result = $stmt->execute(); // 现在你可以处理 $result 来展示数据了 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值