如何在SQL中从指定表中选取唯一行?(附示例表与预期结果)
如何在SQL中从表中选取唯一行
假设你的表名为price_ranges,先来看原始数据:
| Minimum | Maximum | Price |
|---|---|---|
| 0.000 | 1.000 | 50.000 |
| 0.100 | 1.000 | 60.000 |
| 1.100 | 2.000 | 60.000 |
| 1.000 | 2.000 | 60.000 |
从你给出的预期结果来看,核心需求是针对相同价格组,保留范围更精准(也就是起始值更大)的行,同时保留价格唯一的行。下面提供两种实用的实现方案:
方法1:使用窗口函数(适配大部分现代SQL数据库)
如果你的数据库支持窗口函数(比如PostgreSQL、MySQL 8.0+、SQL Server等),可以用ROW_NUMBER()来快速筛选目标行:
SELECT Minimum, Maximum, Price FROM ( SELECT Minimum, Maximum, Price, -- 按价格和最大值分组,每组内按起始值倒序排序 ROW_NUMBER() OVER ( PARTITION BY Price, Maximum ORDER BY Minimum DESC ) AS row_rank FROM price_ranges ) ranked_ranges WHERE row_rank = 1;
这个查询的逻辑很直观:
- 把相同
Price和Maximum的行归为一组 - 每组内按
Minimum从大到小排序,给行打排名 - 只保留每组的第1行,也就是该组里起始值最大的行,刚好符合你的预期输出
方法2:使用关联查询(兼容旧版SQL数据库)
如果你的数据库不支持窗口函数,用关联查询也能实现同样的效果:
SELECT pr1.Minimum, pr1.Maximum, pr1.Price FROM price_ranges pr1 LEFT JOIN price_ranges pr2 ON pr1.Price = pr2.Price AND pr1.Maximum = pr2.Maximum AND pr2.Minimum > pr1.Minimum WHERE pr2.Minimum IS NULL;
这个思路是:
- 自关联表,寻找同价格、同最大值,但起始值更大的行
- 如果找不到这样的行,说明当前行就是该组里起始值最大的,直接保留它
最终执行结果
不管用哪种方法,都会得到你想要的唯一行结果:
| Minimum | Maximum | Price |
|---|---|---|
| 0.000 | 1.000 | 50.000 |
| 1.100 | 2.000 | 60.000 |
内容的提问来源于stack exchange,提问作者Bhanu Pratap
相关产品推荐
相关产品推荐

