I hoping to find the answer on how I can fill in lead and lag values.
Input:
BRAND Promo_Start VALUE
TESLA 2016-06-05 NULL
TESLA 2016-06-12 NULL
TESLA 2016-06-19 40000
TESLA 2016-06-26 75000
TESLA 2016-07-03 75000
TESLA 2016-07-10 NULL
My desired output is:
BRAND Promo_Start VALUE
TESLA 2016-06-05 40000
TESLA 2016-06-12 40000
TESLA 2016-06-19 40000
TESLA 2016-06-26 75000
TESLA 2016-07-03 75000
TESLA 2016-07-10 75000
I've been able to fill in the last value, however, I've not been successful with filling in the first two values.
BRAND Promo_Start VALUE FILLED_VALUE
TESLA 2016-06-05 NULL NULL
TESLA 2016-06-12 NULL NULL
TESLA 2016-06-19 40000 40000
TESLA 2016-06-26 75000 75000
TESLA 2016-07-03 75000 75000
TESLA 2016-07-10 NULL 75000
Using this query:
WITH help1 as (
SELECT *,
CASE WHEN [VALUE] IS NULL THEN 0 ELSE 1 END CHANGEINDICATOR
FROM #SOExample
)
, help2 as (
SELECT *, SUM(CHANGEINDICATOR) OVER (ORDER BY [Promo_Start]) RowGroup from help1
)
SELECT [BRAND],[Promo_Start],[VALUE],
CASE WHEN [VALUE] IS NOT NULL THEN [VALUE]
ELSE FIRST_VALUE([VALUE]) OVER (PARTITION BY RowGroup ORDER BY [Promo_Start])
END [FILLED_VALUE]
FROM help2
GO
Table was created using:
CREATE TABLE #SOExample
([BRAND] varchar(10),[Promo_Start] varchar(10), [VALUE] varchar(15))
;
GO
INSERT INTO #SOExample
([BRAND],[Promo_Start], [VALUE])
VALUES
('TESLA', '2016-06-05',NULL),
('TESLA', '2016-06-12',NULL),
('TESLA', '2016-06-19','40000'),
('TESLA', '2016-06-26','75000'),
('TESLA', '2016-07-03','75000'),
('TESLA', '2016-07-10',NULL)
;
GO
I think this question may be similar to: LAG() / LEAD() of the next rank (Postgresql) and I've looked at this for creating a flag and this because it seems to be a similar question.
I've also looked into dense_rank and using a change indicator (change from NULL to a value in next row and value to NULL in next row).