MySQL中按唯一ID基于两列数据查询最小值的实现
解决方案:按ID取Fig1和Fig2的全局最小值
这里有两种实用的方法来实现你的需求,能轻松得到每个唯一ID对应的Fig1和Fig2中的最小值:
方法1:列转行后分组取最小(通用所有SQL方言)
这种方法通过UNION ALL把Fig1和Fig2的所有值合并到同一列,再按ID分组取最小值,兼容性最强,几乎适用于所有数据库:
SELECT ID, MIN(value) AS "Min Value" FROM ( -- 把Fig1的所有值纳入结果集 SELECT ID, Fig1 AS value FROM your_table UNION ALL -- 把Fig2的所有值纳入结果集(UNION ALL不会去重,保留所有原始数据) SELECT ID, Fig2 AS value FROM your_table ) AS unpivoted_data GROUP BY ID;
逻辑说明:
- 子查询里的
UNION ALL将每个ID的Fig1和Fig2值全部放到value列中,相当于把横向的两列转成纵向的行; - 外层通过
GROUP BY ID对每个ID分组,用MIN(value)提取该ID所有Fig1、Fig2值中的最小数。
方法2:先取每行最小再聚合(简洁高效,需支持LEAST函数)
如果你的数据库支持LEAST()函数(比如MySQL、PostgreSQL、Oracle等),可以用更简洁的写法:先计算每行中Fig1和Fig2的最小值,再对每个ID的这些行最小值取全局最小:
SELECT ID, MIN(LEAST(Fig1, Fig2)) AS "Min Value" FROM your_table GROUP BY ID;
兼容SQL Server的写法:
SQL Server没有内置LEAST()函数,可用CASE语句替代:
SELECT ID, MIN(CASE WHEN Fig1 < Fig2 THEN Fig1 ELSE Fig2 END) AS "Min Value" FROM your_table GROUP BY ID;
测试结果
代入你提供的测试数据,两种方法都会输出预期结果:
| ID | Min Value |
|---|---|
| A-1 | -18 |
| A-2 | 18 |
内容的提问来源于stack exchange,提问作者Vector JX
相关产品推荐
相关产品推荐

