https://www.youtube.com/watch?v=MQXfhH1d8K0
create table sku
(
sku_id int,
price_date date ,
price int
);
delete from sku;
insert into sku values
(1,'2023-01-01',10)
,(1,'2023-02-15',15)
,(1,'2023-03-03',18)
,(1,'2023-03-27',15)
,(1,'2023-04-06',20)
WITH
DATE_FORMAT()
DATE_ADD()
ROW_NUMBER()
LAG()
UNION_UNION ALL
WITH cte as (
SELECT *
, ROW_NUMBER() OVER (Partition by sku_id,year(price_date),month(price_date) order by price_date desc) AS rn
FROM sku),
cte2 as (
SELECT sku_id,date_format(date_add(price_date,INTERVAL 1 Month),'%Y-%m-01') AS price_date,price FROM cte
WHERE rn = 1
UNION all
SELECT *
FROM sku
where dayofmonth(price_date) = 1 AND date_format(date_add(price_date,INTERVAL 1 Month),'%Y-%m-01') NOT IN (select price_date from sku where dayofmonth(price_date) = 1)
order by price_date
)
SELECT sku_id,price_date,price,price-LAG(price,1,price) OVER(order by price_date) AS diff
from cte2