You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询实现:统计Items表中各商品对应价格更低的商品数量

实现方案

你要的统计逻辑是逐行计算Items表中价格严格低于当前商品的总条数,有两种成熟实现方式,你之前写同表子查询出错基本都是边界条件或语法细节没写对:

1. 关联子查询实现(全SQL版本兼容)

这是最通用的写法,不依赖数据库版本,逻辑和你尝试的同表查询思路一致,正确代码如下:

SELECT
  t1.ID,
  t1.Name,
  (SELECT COUNT(*) FROM Items t2 WHERE t2.Price < t1.Price) AS Count
FROM Items t1;

关键注意点:比较条件必须用严格小于<,如果误用<=会把和当前商品价格相同的记录也算入统计,直接导致结果错误。如果表中存在Price为NULL的商品,NULL不会参与大小比较,不会被计入计数,符合常规业务逻辑。

2. 窗口函数实现(支持OLAP函数的数据库推荐,性能更优)

如果你的数据库是MySQL 8.0及以上、PostgreSQL、SQL Server等支持窗口函数的版本,数据量较大时优先用这个写法,避免关联子查询逐行匹配的性能损耗:

SELECT
  ID,
  Name,
  RANK() OVER (ORDER BY Price) - 1 AS Count
FROM Items;

这里必须用RANK()函数,不能用ROW_NUMBER():如果存在多个商品价格相同,RANK()会给相同价格的记录相同的排名,减1之后刚好是价格更低的商品总数。比如两个商品都是全表最低价,RANK()返回的排名都是1,减1后Count为0,符合预期;如果误用ROW_NUMBER(),会给同价商品分配不同序号,结果就会出错。

常见错误原因

你之前的子查询写法没得到正确结果,基本是踩了以下几个坑:

  • 子查询和主表没加别名,或者字段没加表前缀,导致字段匹配逻辑错误
  • 价格比较用了<=而非<,把同价商品算入了统计
  • 统计条数时用了COUNT(某字段)而非COUNT(*),如果对应字段存在NULL值会漏统计
  • 尝试用窗口函数时选错了排名函数,导致同价商品的计数不符合要求

内容的提问来源于stack exchange,提问作者volairs22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:57:21