无法基于销售额排序商品,请求排查SQL行号计算错误
问题排查与解决方案
咱们直接拆解你遇到的两个核心问题,根源都在SQL语句的细节处理上:
问题1:所有商品的rownum均为1
这个问题的直接原因是**PARTITION BY ITEM_NUM的误用**:
- 你用
PARTITION BY ITEM_NUM会把每个商品单独划分为一个分区,而每个分区里只有该商品的一行数据,ROW_NUMBER()会给每个分区的唯一行分配序号1,自然所有结果的rownum都是1。 - 如果你的需求是所有商品基于销售额做全局排名,完全不需要
PARTITION BY子句;如果是要在特定分组内排名,才需要调整分区字段,但显然这里你要的是全局排序后的序号。
问题2:无法基于销售额对商品排名
这个是因为字段别名不匹配:
- 内层查询里你把求和后的销售额别名设为
LW_REVENUE,但外层查询排序时用了LW_REV,数据库找不到这个字段,直接导致排序逻辑失效,自然没法按销售额排名。 - 另外原SQL外层排序用了
LW_OPS,但内层根本没这个字段,这也是一个明显的笔误。
修正后的SQL语句
SELECT ITEM_NUM, LW_REVENUE, ROW_NUMBER() OVER (ORDER BY LW_REVENUE DESC) AS ROWNUM FROM ( SELECT ITEM_NUM, SUM(REVENUE) AS LW_REVENUE FROM D_DAILY_SALES WHERE ACTIVITY_DAY BETWEEN TO_DATE('20190302', 'YYYYMMDD') -6 AND TO_DATE('20190302', 'YYYYMMDD') AND ITEM_NUM IN ( '1002', '1120', '1144', '1145', '1204', '1240', '1245', '1344', '1345', '1365', '1387', '1500', '1512', '1573', '1577', '1597', '1672', '1706', '1746', '1748', '1788', '1854', '1895', '1928' ) GROUP BY ITEM_NUM ) ORDER BY LW_REVENUE DESC;
关键修正点说明
- 移除了
PARTITION BY ITEM_NUM,让ROW_NUMBER()基于所有商品的销售额生成全局排名序号 - 统一了销售额的别名:内层和外层都使用
LW_REVENUE,避免字段识别错误 - 把外层排序字段改成了
LW_REVENUE,匹配你"根据Revenue分配rownum"的需求
如果你的业务场景需要相同销售额的商品获得相同排名,可以把ROW_NUMBER()换成RANK()(相同排名会跳过后续序号)或者DENSE_RANK()(相同排名不会跳过后续序号),按需调整即可。
内容的提问来源于stack exchange,提问作者nurul
相关产品推荐
相关产品推荐

