MySQL使用row_number() over partition by实现列去重问题求解
问题修复与实现代码
你原有代码存在语法错误和逻辑规则错误,修正后的可执行语句如下,完全匹配你的需求:
SELECT product_name, id, date, customer_id FROM ( SELECT product_name, id, date, customer_id, ROW_NUMBER() OVER(PARTITION BY customer_id, product_name ORDER BY date DESC) AS rn FROM mvmt_dtl e WHERE mvt_date_id_part_key >= '2020-01-01' AND product_name IN ('Product P1', 'Product P2') AND customer_id IN (SELECT a.line_number FROM simp_output_dci a) ) AS filtered_data WHERE rn = 1 ORDER BY customer_id;
关键逻辑说明
- 语法修正:补全了原语句中
customer_id和order by之间缺失的空格 - 分区规则调整:将窗口函数的分区字段改为
customer_id + product_name,保证每个用户下的每个产品单独归类到一个分组,每个分组只会生成一个行号为1的记录 - 产品过滤:在子查询中新增
product_name的过滤条件,仅保留你需要的P1、P2两个产品 - 去重实现:外层筛选
rn=1的记录,即可实现每个customer_id分区内Product列唯一,其余列保留对应最新记录的原始值
内容的提问来源于stack exchange,提问作者Dhvani Shah
相关产品推荐
相关产品推荐

