Подсчет общих и эксклюзивных product_ids - PullRequest
0 голосов
/ 08 мая 2020

Для каждого 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
```
...