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