I have a SQL Server temporal table with the following data:
ID ValidFrom ValidTo MyValue
23 7/7/19 13:51 7/7/19 13:51 0
23 7/7/19 13:51 9/9/19 11:22 0
23 9/9/19 11:22 9/9/19 11:23 0
23 9/9/19 11:23 5/14/20 23:02 0
23 5/14/20 23:02 5/16/20 20:02 0
23 5/16/20 20:02 5/16/20 23:53 0
23 5/16/20 23:53 5/16/20 23:58 0
23 5/16/20 23:58 5/16/20 23:58 0
23 5/16/20 23:58 5/16/20 23:59 0
23 5/16/20 23:59 5/17/20 0:16 0
23 5/17/20 0:16 5/17/20 1:47 0
23 5/17/20 1:47 5/17/20 1:48 0
23 5/17/20 1:48 5/20/20 16:52 0
23 5/20/20 16:52 5/20/20 16:52 0
23 5/20/20 16:52 8/22/20 0:22 0
23 8/22/20 0:22 9/3/20 20:22 0
23 9/3/20 20:22 9/3/20 20:23 0
23 9/3/20 20:23 12/31/99 0:00 6
I want to perform a query so I only get the point of change of the 'MyValue', like so:
23 7/7/19 13:51 7/7/19 13:51 0
23 9/3/20 20:23 12/31/99 0:00 6
SELECT ID, ValidFrom, ValidTo, MyValue FROM MyTable FOR SYSTEM_TIME ALL WHERE ID = 23
Gets me the values, but how do I arrive at my desired two-column result?
The following proposed solution does NOT work:
WITH data AS
(
SELECT ID, ValidFrom, MyValue,
LAG(MyValue, 1) OVER (PARTITION BY ID ORDER BY ValidFrom) prevVal,
LEAD(MyValue, 1) OVER (PARTITION BY ID ORDER BY ValidFrom) nextVal
FROM MyTable FOR SYSTEM_TIME ALL WHERE ID = 23
)
SELECT ID, ValidFrom, MyValue
FROM data
WHERE (prevVal IS NOT NULL AND prevVal <> MyValue) OR
(nextVal IS NOT NULL AND nextVal <> MyValue)
ORDER BY ValidFrom DESC;
Resulting in the following results:
ID ValidFrom MyValue
23 2020-09-03 20:23:32.23 6
23 2020-09-03 20:22:00.41 0