запрос базы данных «Облако снежинок» для определения количества новых и удаленных SKU - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующие столбцы в таблице, и я хотел бы показать количество новых sku и убранных sku по дате покупки, сравнивая предыдущий день.

SHOP_Date       SKU     
01-13-2020       1
01-13-2020       2
01-14-2020       1
01-14-2020       3
01-15-2020       4
01-15-2020       2

мои выходные данные должны быть такими, как показано ниже

shop date        #New product         #Remove product
01-13-2020           2                     0
01-14-2020           1                     1
01-15-2020           2                     2

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вот мое решение: шаг за шагом достигается результат, используется предложение WITH, поэтому вам нужно выбрать полный текстовый прогон, он работает в Oracle как есть, и если вы хотите работать в Snowflake, просто удалите «из двойного». «.

WITH t 
 AS (SELECT 13 AS shop_date, 
            1  AS SKU 
     FROM   dual 
     UNION ALL 
     SELECT 13 AS shop_date, 
            2  AS SKU 
     FROM   dual 
     UNION ALL 
     SELECT 14 AS shop_date, 
            1  AS SKU 
     FROM   dual 
     UNION ALL 
     SELECT 14 AS shop_date, 
            3  AS SKU 
     FROM   dual 
     UNION ALL 
     SELECT 15 AS shop_date, 
            4  AS SKU 
     FROM   dual 
     UNION ALL 
     SELECT 15 AS shop_date, 
            2  AS SKU 
     FROM   dual), 
 date_rel 
 AS (SELECT shop_date                AS C_Day, 
            Lag(shop_date) 
              over ( 
                ORDER BY shop_date ) AS P_Day 
     FROM   (SELECT DISTINCT shop_date 
             FROM   t)), 
 c_mns_p 
 AS (SELECT shop_date AS d1, 
            sku 
     FROM   t 
     MINUS 
     (SELECT date_rel.c_day d1, 
             t1.sku 
      FROM   date_rel, 
             t t1 
      WHERE  date_rel.p_day = t1.shop_date)), 
 p_mns_c 
 AS ((SELECT date_rel.c_day d1, 
             t1.sku 
      FROM   date_rel, 
             t t1 
      WHERE  date_rel.p_day = t1.shop_date) 
     MINUS 
     SELECT shop_date AS d1, 
            sku 
     FROM   t), 
 c_mns_p_cnt 
 AS (SELECT d1, 
            Count(sku) cnt 
     FROM   c_mns_p 
     GROUP  BY d1), 
 p_mns_c_cnt 
 AS (SELECT d1, 
            Count(sku) cnt 
     FROM   p_mns_c 
     GROUP  BY d1), 
 result 
 AS (SELECT d_rel.c_day             AS Shop_Date, 
            c_mns_p_cnt.cnt         AS New_sku_Cnt, 
            Nvl(p_mns_c_cnt.cnt, 0) AS removed_sku_cnt 
     FROM   date_rel d_rel, 
            c_mns_p_cnt, 
            p_mns_c_cnt 
     WHERE  d_rel.c_day = c_mns_p_cnt.d1 
            AND d_rel.c_day = p_mns_c_cnt.d1(+)) 
SELECT * FROM   result ORDER  BY 1; 
0 голосов
/ 11 марта 2020

Вы можете использовать lag(), а затем использовать агрегацию. Я не совсем уверен, каким должен быть столбец «удалить». Подсчет за каждый день складывается из количества продуктов на эту дату, поэтому я интерпретирую это как существующее число:

select shop_date,
       sum(case when prev_shop_date is null or shop_date <> prev_shop_date + interval '1 day'
                then 1 else 0
           end) as num_new,
       sum(case when shop_date = prev_shop_date + interval '1 day'
                then 1 else 0
           end) as num_existing
from (select t.*,
             lag(shop_date) over (partition by sku order by shop_date) as prev_shop_date
      from t
     ) t
group by shop_date;
...