【问题标题】:How to Remove Overlap Using Window Function in Hive/Spark SQL如何在 Hive/Spark SQL 中使用窗口函数删除重叠
【发布时间】:2019-11-11 15:04:19
【问题描述】:

我有一张包含客户和产品信息的表格。

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 并重新排名,以便promotion 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() 函数,但我似乎无法得到它。

【问题讨论】:

  • promotion_id 556 的 product_id 278 部分呢?

标签: sql hive apache-spark-sql pyspark-sql window-functions


【解决方案1】:

使用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

【讨论】:

  • 感谢您的解决方案,但恐怕这不起作用。
  • @DataTx 反例?
  • Row_Number()需要切换到DENSE_RANK() OVER(PARTITION BY CUSTOMER_ID, PRODUCT_ID ORDER BY PRODUCT_ID, PROMOTION_ID )
  • 但是你的建议对我来说绝对是正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多