如何用单条SELECT语句筛选b列最大值对应a列的最小值?
在单条SELECT语句中筛选列b取最大值时列a的最小值
需要用单条SELECT语句,找出当列b(整数)取最大值时,列a(整数)的最小值。
你尝试的错误代码
SELECT MIN(a) OVER (PARTITION BY MAX(b)) as res -- 语法不合法 FROM table
错误原因:窗口函数的PARTITION BY子句不能直接使用聚合函数MAX(b),分区字段需为表中已存在的列或确定表达式,无法直接基于动态聚合结果分区。
示例数据
| a | b |
|---|---|
| 1 | 1 |
| 1 | 3 |
| 2 | 3 |
预期返回结果
| res |
|---|
| 1 |
可行解法
解法1:子查询获取最大b,再筛选对应行的最小a
SELECT MIN(a) AS res FROM your_table WHERE b = (SELECT MAX(b) FROM your_table);
这是最通用的写法,几乎所有SQL数据库都支持:先通过子查询拿到全表b的最大值,再筛选出所有b等于该值的行,最后取这些行中a的最小值。
解法2:用窗口函数标记最大b的行,再取最小a
SELECT MIN(a) AS res FROM ( SELECT a, b, MAX(b) OVER () AS max_b FROM your_table ) AS sub WHERE b = max_b;
内层通过窗口函数MAX(b) OVER ()计算全表b的最大值,外层筛选出b等于最大值的行,再取这些行的a最小值,整体属于单条SELECT语句(包含嵌套子查询)。
解法3:排序后取首行(适用于PostgreSQL、SQL Server等支持语法的数据库)
SELECT a AS res FROM your_table ORDER BY b DESC, a ASC FETCH FIRST 1 ROW ONLY;
按b降序、a升序排序,取第一行的a值——因为b最大的分组里,a最小的行排在最前面,结果符合预期。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

