数据分组取最大值行

问题描述:

按照指定列分组(例如 stationId),统计指定列(例如T)的最大值
要查出T最大对应整行数据。T最大时可能有多个相同值,只要其中任一行就可以。

stationID  T   F   ......(表示多列)
1          5   9    | 
1          5   8    |   查出这两行中的一行
2          6   7
2          7   6    |  这行要查出

 

 

方法二:适用于SQL2000,构造委派序列。

 

 

但是方法二有要构造合适的条件,比方说数据改为:

方法一结果是我们想要的,方法二由于筛选器构造不合适,表现不佳。

### SQL 分组查询中获每组最大值的方法 在 SQL 中,如果需要通过分组查询来获每组的最大值记录,可以采用多种方法实现。以下是几种常见的解决方案: #### 方法一:使用子查询与 `IN` 关键字 这种方法适用于大多数数据库系统。可以通过嵌套子查询的方式先找到每组中的最大值,然后再匹配对应的记录。 ```sql SELECT id, iceName, createDate, createTime, orderPath, exceptionType, orderId, emailStatus, systemTime FROM orderAlarms WHERE (iceName, orderPath, exceptionType, systemTime) IN ( SELECT iceName, orderPath, exceptionType, MAX(systemTime) FROM orderAlarms WHERE emailStatus = '1' GROUP BY iceName, orderPath, exceptionType ); ``` 此方法利用了 `(列名列表)` 的形式,在子查询中计算出每组的最大值并返回完整的元组[^3]。 --- #### 方法二:使用窗口函数(Window Function) 对于支持窗口函数的数据库(如 PostgreSQL、Oracle 和 MySQL 8.0+),可以更高效地完成这一任务。窗口函数允许我们在不破坏原始数据结构的情况下执聚合操作。 ```sql WITH RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY score DESC) as rn FROM user ) SELECT * FROM RankedData WHERE rn = 1; ``` 这里使用了 `ROW_NUMBER()` 函数为每一组内的记录按指定顺序分配唯一编号,并最终筛选出排名为 1 的记录[^2]。 --- #### 方法三:自连接法 另一种常见方式是通过自连接来比较同一组内其他成员的关系。假设目标是从 `user` 表中提每个部门 (`dept_id`) 下分数最高的用户,则可如下编写: ```sql SELECT u1.* FROM user u1 LEFT JOIN user u2 ON u1.dept_id = u2.dept_id AND u1.score < u2.score WHERE u2.uid IS NULL; ``` 该逻辑的核心在于确保当前不存在任何同组下具有更高分数的记录[^4]。 --- ### 总结 以上三种方案各有优劣: - **子查询 + IN** 易于理解但可能性能较差; - **窗口函数** 提供更高的灵活性和效率,尤其适合现代关系型数据库; - **自连接** 则无需额外创建临时表或视图即可达成目的。 具体选择决于实际需以及所使用的数据库引擎特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值