pgsql:获取分组中最大或最小的一条数据

本文介绍了如何使用SQL查询语句对数据进行分组排序,并通过ROW_NUMBER函数筛选出每组的最大记录。查询涉及arch_id字段,限定在指定时间段内,并针对特定ID筛选。最终通过子查询获取每个分组的第一条记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤1:查询并排序各分组的记录

sql的查询语句如下:

SELECT 
    tb.curr_read,tb.arch_id,
    ROW_NUMBER() OVER(PARTITION by arch_id ORDER BY year_month desc)idx 
FROM t_month_cdate tb
WHERE tb.year_month BETWEEN '2021-01' and '2021-05' 
and arch_id in('00004','00005','00006')

查询结果:

说明:

1.ROW_NUMBER:该函数可以对分组进行编号

2.PARTITION by :对arch_id 这个字段进行分组

3.ORDER BY:在分组区间内按year_month 进行倒序

步骤二:筛选出最大记录

在原查询结果中筛选出idx第一条,即为最大记录。

以上调整后的sql语句如下:

SELECT * FROM
(
SELECT tb.curr_read,tb.arch_id,ROW_NUMBER() OVER(PARTITION by arch_id ORDER BY year_month desc)idx FROM t_month_cdate tb
WHERE tb.year_month BETWEEN '2021-01' and '2021-05' and arch_id in('00004','00005','00006')
)tm
WHERE idx=1

输出结果:

以上完毕。

 

### PostgreSQL 窗口函数概述 窗口函数是在不改变原始表格行数的情况下,对一组特定记录进行聚合运算的功能。这使得可以在同一查询中既保留每条记录的信息又获得基于某些条件的汇总信息[^1]。 ### 基本语法结构 窗口函数的一般形式如下: ```sql window_function(args...) OVER ( [PARTITION BY partition_expression] [ORDER BY sort_expression [ASC|DESC]] [frame_clause] ) ``` 这里`window_function`代表具体的窗口函数名称;`args...`表示传递给该函数所需的参数列表;而`OVER()`子句定义了窗口框架及其分区方式和排序规则[^2]。 ### 实际应用案例 考虑一个学生评分表 `students` ,它包含了三个字段:`student_id`, `class_id` 和 `score`. 若要获取每个班级内学生的排名情况,则可采用如下的SQL语句实现: ```sql SELECT student_id, class_id, score, ROW_NUMBER() OVER(PARTITION BY class_id ORDER BY score DESC) AS rank_in_class FROM students; ``` 上述命令会返回一张新表,在原有基础上增加了名为 `rank_in_class` 的一列来展示各班内的成绩排行位置[^5]. ### 关键点解析 - **ROW_NUMBER():** 此函数用于分配唯一的连续整数值作为序号,通常配合`PARTITION BY`一起使用以便于分组计数。 - **PARTITION BY:** 它的作用类似于GROUP BY但是不会减少结果集中的行数量而是按照指定表达式的值将数据划分为多个逻辑上的部分即“窗格”。 - **ORDER BY:** 对每一个由`PARTITION BY`所形成的独立窗格内部的数据项依据某个某几个属性进行升序/降序排列。 - **FRAME CLAUSE(帧子句):** 可选组件用来进一步限定参与计算的具体范围,默认情况下整个窗格都属于当前帧的一部分[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值