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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
postgresql分页是指在查询数据时,将结果按照一页一页的形式返回给用户,以便用户可以分批次地获取数据。在postgresql中,可以使用LIMIT和OFFSET子句来实现分页查询。 LIMIT子句用于指定每一页返回的记录数量,而OFFSET子句用于指定起始位置的偏移量。通过配合使用这两个子句,可以实现对数据的分页查询。 例如,在mapper层对数据进行处理时,可以使用LIMIT和OFFSET子句来实现分页查询。具体的sql语句可以类似下面的样子: ```sql SELECT A.uid, A.name, A.type, A.ph, A.organic, A.n, A.p, A.k, A.cjqydm FROM tb_village A WHERE A.name LIKE CONCAT('%', #{name}, '%') OFFSET #{page}::bigint LIMIT #{limit}::bigint ``` 其中,#{name}表示查询条件中的名称,#{page}表示当前页数,#{limit}表示每页返回的记录数量。通过将实际的参数传入到sql语句中,就可以实现分页查询。 在controller层对数据的参数进行调整时,可以根据用户请求的页数和每页记录数量来计算出对应的偏移量和限制数量,然后将这些参数传递给mapper层进行查询。具体的代码可以类似下面的样子: ```java @RequestMapping("/GetVillageList.in") @ResponseBody public String GetVillageList(@RequestParam Map map) { Integer page = Integer.parseInt((String) map.get("page")); Integer limit = Integer.parseInt((String) map.get("limit")); map.put("page", (page - 1) * limit); map.put("limit", limit); ResultModel resultModel = new ResultModel(); List<Map> a = mapMapper.likeList(map); if (a != null) { resultModel.data = a; } else { resultModel.type = "error"; } return gson.toJson(resultModel); } ``` 通过对请求参数进行处理,将计算出的偏移量和限制数量传递给mapper层的sql语句,就可以实现分页查询功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PostGreSQL分页查询](https://blog.csdn.net/VIP_1205169154/article/details/121673187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [postgresql的分页](https://blog.csdn.net/qq_36213352/article/details/87023315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值