MySQL中如何用TOP 2含并列查询第二高零件成本及对应信息
获取MySQL中成本第二高(含并列)的零件信息
嘿,我来帮你搞定这个需求!要拿到成本第二高且包含并列情况的零件编号(PartNbr)和描述,在MySQL里有两种实用方案,分别适配不同版本的MySQL:
方案1:适用于MySQL 5.x(无窗口函数版本)
如果你的MySQL版本还没到8.0,没法用窗口函数,可以通过子查询先锁定第二高的成本值,再筛选对应记录:
SELECT PartNbr, Description, Cost FROM Parts WHERE Cost = ( -- 先去重成本值,按降序排序后取第2个值(即第二高的成本) SELECT DISTINCT Cost FROM Parts ORDER BY Cost DESC LIMIT 1 OFFSET 1 );
逻辑说明:
- 子查询里的
DISTINCT Cost会先把重复的成本值去掉,避免因为多个最高成本导致偏移错误; ORDER BY Cost DESC把成本从高到低排序,LIMIT 1 OFFSET 1跳过第一个(最高)值,取第二个值,也就是我们要的第二高成本;- 外层查询会返回所有成本等于这个第二高值的零件,自然就包含了并列的情况。
方案2:适用于MySQL 8.0+(窗口函数优雅版)
如果你的MySQL是8.0及以上版本,用窗口函数RANK()会更直观灵活,天生支持并列排名:
-- 先给每个零件按成本降序排名 WITH RankedParts AS ( SELECT PartNbr, Description, Cost, -- RANK()会给相同成本的零件分配相同排名,跳过中间空缺 RANK() OVER (ORDER BY Cost DESC) AS cost_rank FROM Parts ) -- 筛选排名为2的记录,就是所有第二高成本的零件 SELECT PartNbr, Description, Cost FROM RankedParts WHERE cost_rank = 2;
逻辑说明:
RANK()窗口函数会按照成本从高到低给零件排名:如果有多个零件是最高成本,它们的排名都是1;接下来的第二高成本零件,排名都会是2;- 用CTE(公共表表达式)先计算好排名,再筛选排名为2的记录,就能直接得到所有并列第二高的零件。
小提示:
如果你的场景中需要“紧密排名”(比如即使有多个最高,第二高的排名依然是2,而不是跳过),RANK()已经满足需求;如果遇到有间隔的情况(比如最高是100,没有90,直接到80),RANK()会给80的零件排名2,这也符合“第二高”的定义。
内容的提问来源于stack exchange,提问作者rgo
相关产品推荐
相关产品推荐

