如何使用 Hive/Spark SQL 中的 Window 函数删除重叠

How to Remove Overlap Using Window Function in Hive/Spark SQL

我有一个 table 包含客户和产品信息。

customer_id promotion_id   product_id  Rank
1               555            222      1
1               555            223      1 
1               555            999      1
1               556            154      2
1               556            222      2
1               556            278      2 
1               557            432      3
1               557            434      3
1               557            435      3

一些促销活动在产品信息中重叠。例如 promotion_id 555 和 556 可用于产品 222。我想删除 promotion_id 556 并重新排名,以便促销 557 排名第二,如下所示:

customer_id promotion_id   product_id  Rank
1               555            222      1
1               555            223      1 
1               555            999      1
1               557            432      2
1               557            434      2
1               557            435      2 

我一直在乱用 SQL 中的 row_number()/rank() 函数,但我似乎无法理解它。

使用ROW_NUMBER:

SELECT *, DENSE_RANK() OVER(ORDER BY promotion_id) AS new_rank
FROM (SELECT *, DENSE_RANK() OVER(PARTITION BY CUSTOMER_ID, PRODUCT_ID 
                                  ORDER BY PRODUCT_ID, PROMOTION_ID) rn
      FROM tab) s
WHERE rn = 1