We receive QTD data daily, what is needed is to transform it to daily -or even monthly any one would work- The value column has no particular pattern it can increase and decrease and might reach to zero because of the product returns and might be the same value -no purchase- or missing for any other reason
| SKU | value | Date |
|---|---|---|
| ABC | 200 | 2022-01-10 |
| ABC | 300 | 2022-02-10 |
| ABC | 100 | 2022-03-10 |
| XYZ | 1000 | 2022-01-10 |
| XYZ | 1200 | 2022-02-10 |
| XYZ | 2022-03-10 |
Now the required out put should be like this, also avoiding a new quarter value to get subtracted from last day of the previous quarter value
| SKU | value | Date |
|---|---|---|
| ABC | 200 | 2022-01-10 |
| ABC | 100 | 2022-02-10 |
| ABC | -200 | 2022-03-10 |
| XYZ | 1000 | 2022-01-10 |
| XYZ | 200 | 2022-02-10 |
| XYZ | 0 | 2022-03-10 |
The tricky part would be in the entry of the new quarter for example assuming by default that Q4 is from October to December and Q1 from Jan to March
| SKU | value | Date |
|---|---|---|
| ABC | 200 | 2022-01-12 |
| ABC | 300 | 2022-02-12 |
| ABC | 100 | 2022-03-12 |
| ABC | 100 | 2022-01-01 |
| ABC | 250 | 2022-02-01 |
| ABC | 300 | 2022-03-01 |
This should be
| SKU | value | Date |
|---|---|---|
| ABC | 200 | 2022-01-12 |
| ABC | 100 | 2022-02-12 |
| ABC | -200 | 2022-03-12 |
| ABC | 100 | 2022-01-01 |
| ABC | 150 | 2022-02-01 |
| ABC | 50 | 2022-03-01 |
This is on big query any help would be much appreciated
CodePudding user response:
You might consider below.
WITH sample_table AS (
SELECT 'ABC' SKU, 200 value, '2022-01-12' Date UNION ALL
SELECT 'ABC' SKU, 300 value, '2022-02-12' Date UNION ALL
SELECT 'ABC' SKU, 100 value, '2022-03-12' Date UNION ALL
SELECT 'ABC' SKU, 100 value, '2022-01-01' Date UNION ALL
SELECT 'ABC' SKU, 250 value, '2022-02-01' Date UNION ALL
SELECT 'ABC' SKU, 300 value, '2022-03-01' Date
)
SELECT SKU,
IFNULL(value - LAG(value, 1, 0) OVER w, 0) AS value,
Date
FROM (SELECT * REPLACE(PARSE_DATE('%Y-%d-%m', Date) AS Date) FROM sample_table)
WINDOW w AS (PARTITION BY SKU, EXTRACT(YEAR FROM Date), EXTRACT(QUARTER FROM Date)
ORDER BY UNIX_DATE(Date));
Query results

