Вот мое решение: шаг за шагом достигается результат, используется предложение 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;