Case语句内Row_Number函数倒序计算异常问题求助
问题修正方案
核心问题分析
你遇到的Reverse_Ordinal_number结果异常,本质是倒序计算时窗口函数没有仅针对Seller='xx'的行做分组排序,错误地将Seller='yy'的行也纳入了排序范围,导致生成了不符合需求的序号。
修正后的SQL(通用兼容版)
SELECT Order_Id, created_date, Seller, -- 升序序号:仅xx卖家生成序号,yy卖家返回0 CASE WHEN Seller = 'xx' THEN ROW_NUMBER() OVER (PARTITION BY Seller ORDER BY created_date ASC) ELSE 0 END AS Ordinal_number, -- 降序序号:同样仅xx卖家生成倒序序号,yy卖家返回0 CASE WHEN Seller = 'xx' THEN ROW_NUMBER() OVER (PARTITION BY Seller ORDER BY created_date DESC) ELSE 0 END AS Reverse_Ordinal_number FROM orders;
关键修正点
- 分区隔离:用
PARTITION BY Seller将xx和yy卖家的行分成独立分组,确保排序仅在同卖家组内进行,避免不同卖家的行互相干扰。 - 条件控制:通过
CASE WHEN明确判断卖家类型,仅对xx卖家生成序号,yy卖家直接返回0,彻底排除无关行的影响。
数据库专属简化方案(如PostgreSQL)
如果使用支持FILTER子句的数据库,可以进一步简化写法:
SELECT Order_Id, created_date, Seller, COALESCE( ROW_NUMBER() OVER (PARTITION BY Seller ORDER BY created_date ASC) FILTER (WHERE Seller = 'xx'), 0 ) AS Ordinal_number, COALESCE( ROW_NUMBER() OVER (PARTITION BY Seller ORDER BY created_date DESC) FILTER (WHERE Seller = 'xx'), 0 ) AS Reverse_Ordinal_number FROM orders;
FILTER子句直接指定窗口函数仅作用于符合条件的行,COALESCE函数将不符合条件的NULL结果转为0,完全匹配需求。
内容的提问来源于stack exchange,提问作者Soha Khan
相关产品推荐
相关产品推荐

