如何使用 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
我有一个 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