Для каждого Merchant_id
и date
я пытаюсь получить следующее:
- Подсчитайте product_id с помощью
usage_status
= 'new' и 'old' , которые принадлежат product_category
= 'shared_products' (, что означает, что товар существует как в store_1, так и в store_2, но учитывается только один раз ) - Подсчитать product_id с
usage_status
= 'new' и 'old' , которые принадлежат product_category
= 'exclusive_product_store_1' или 'exclusive_product_store_2' ( товары, которые существуют исключительно в store_1 и store_2 соответственно)
Merchant_id Partition_date Usage_status Product_category Count_product_id
1 2020-04-10 new shared_products 245
2 2020-04-10 used exclusive_product_store_1 354
3 2020-04-10 used exclusive_products_store_2 539
Я использую запрос ниже - для shared_products
я получаю правильный номер, но почему-то для exclusive products
есть несколько выбросов
with cte_1(
SELECT ,partition_date
,store_id
,merchant_id
,count(product_id) as count_product_id_per_merchant
FROM main_table
GROUP BY 1,2,3),
cte_2 as(
SELECT partition_date
,merchant_id
,max(count_product_id_per_merchant) AS max_product_id_count
,min(count_product_id_per_merchant) AS min_product_id_count
FROM cte_1
GROUP BY 1,2),
cte_3 as (
SELECT partition_date
,merchant_id
,(max_product_id_count - min_product_id_count) count_shared_productID_per_merchant
FROM cte_2),
cte_4 as (
SELECT partition_date
,product_id
,store_id
,merchant_id
,usage_status
, row_number() over (partition by merchant_id, store_id order by merchant_id, store_id, usgae_status as product_rn
from main_table),
cte_5 as(
SELECT cte_4.partition_date
,cte_4.product_id
,cte_4.merchant_id
, cte_4.usage_status
,cte_4.product_rn
, CASE WHEN cte_4.product_rn <= cte_3.count_shared_productID_per_merchant AND cte_4.store_id = 'store_1' THEN 'shared_products'
WHEN cte_4.product_rn > cte_3.count_shared_productID_per_merchant AND cte_4.store_id = 'store_2' THEN 'exclusive_product_store_2'
WHEN cte_4.product_rn > cte_3.count_shared_productID_per_merchant AND cte_4.store_id = 'store_1' THEN 'exclusive_product_store_1'
ELSE NULL END AS product_category
FROM cte_4
LEFT JOIN cte_3 on cte_4.merchant_id = cte_3.merchant_id)
SELECT cte_4.merchant_id
,cte_4.partition_date
,cte_4.usage_status
,cte_4.product_category
,count(article_id) as Count_product_id
FROM cte_4
LEFT JOIM main_table mt ON mt.merchant_id 0N cte_4.merchant_id
GROUP BY 1,2,3,4
```