Oracle 11G中Row_number函数未达预期效果的问题排查
问题分析与解决方案
你遇到的问题大概率是以下几个原因之一:
- 在
row_number()的PARTITION BY子句中包含了item以外的列,导致数据被拆分成多个分组,每个分组都生成了行号1的记录 - 没有在外层查询中添加
WHERE rn = 1的筛选条件,所有带行号的记录都被返回了 ORDER BY子句没有按last_update_date降序排列,导致最新的记录没被标记为行号1
正确的SQL写法示例
SELECT item, cod_line, business, cod_business, cod_ez_catalog_product_brand, business_unit, last_update_date FROM ( SELECT item, cod_line, business, cod_business, cod_ez_catalog_product_brand, business_unit, last_update_date, -- 仅按item分组,按更新日期倒序生成行号 ROW_NUMBER() OVER (PARTITION BY item ORDER BY last_update_date DESC) rn FROM products_table WHERE item = '94TERFERE' ) t -- 筛选出行号为1的最新记录 WHERE rn = 1;
补充说明
如果存在多条记录的last_update_date完全相同的情况,row_number()会随机选取其中一条。若想要保留所有更新日期最新的记录,可以将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
内容的提问来源于stack exchange,提问作者JustToKnow
相关产品推荐
相关产品推荐

