SQL技术求助:基于B列最小值选择A列数据并保留重复行
解决思路与SQL方案
嘿,这个需求其实挺常见的,我给你两种实用的解决办法,不管是全局找B列最小值还是按A分组找,都能轻松保留所有重复行~
场景1:全局筛选B列最小值对应的所有行
如果你的需求是找出整个表中B列数值最小的所有行(就像你举的例子那样),最直接的写法就是用子查询先拿到B的全局最小值,再筛选匹配的行:
SELECT A, B FROM your_table WHERE B = (SELECT MIN(B) FROM your_table);
这个逻辑很清晰:先通过SELECT MIN(B) FROM your_table算出B列的最小值,然后把所有B等于这个值的行都挑出来,自然就保留了所有重复的符合条件的行,比如你的测试数据会返回那两个(4,5)。
场景2:按A分组,筛选每组中B列最小值的所有行
如果你的实际需求是每个A值对应的B列最小值的所有行(比如不同A各自找最小B的行),那用窗口函数会更灵活:
SELECT A, B FROM ( SELECT A, B, -- 按A分组,计算每组的B最小值 MIN(B) OVER (PARTITION BY A) AS min_b_per_group FROM your_table ) AS temp -- 筛选出当前行B等于组内最小值的记录 WHERE B = min_b_per_group;
举个例子,如果你的数据是(3,5),(3,4),(4,5),(4,5),(4,6),这个查询会返回(3,4),(4,5),(4,5),完美保留每个分组里的所有符合条件的重复行。
为什么这两种方案能保留重复行?
不管是子查询还是窗口函数的写法,我们都是直接匹配所有等于最小值的行,而不是用LIMIT或者只取唯一行的逻辑,所以只要有重复的符合条件的记录,都会被完整保留下来,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

