如何在Hive/Spark SQL中使用窗口函数消除重叠

如何在Hive/Spark SQL中使用窗口函数消除重叠,sql,hive,apache-spark-sql,pyspark-sql,window-functions,Sql,Hive,Apache Spark Sql,Pyspark Sql,Window Functions,我有一张有客户和产品信息的桌子 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

我有一张有客户和产品信息的桌子

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
有些促销活动在产品信息中重叠。例如,促销标识555和556可用于产品222。我想删除促销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\u number()/rank()函数,但似乎无法得到它。

使用
row\u 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

使用
行号

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

谢谢您提供的解决方案,但我担心这不起作用。@DataTx反例?
行号()
需要切换到
密集等级()(按客户ID划分,按产品ID排序,按促销ID划分)
但是你的建议对我来说绝对是正确的方向。谢谢你的解决方案,但我担心这不起作用。@DataTx反例?
行号()
需要切换到
密集等级()(按客户ID划分,按产品ID订购,按产品ID促销)
但是你的建议对我来说绝对是正确的方向。那么产品编号278是促销的一部分吗?产品编号278是促销的一部分吗?