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)

Pasted image 20241123193122.png
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