Let's say I have the following table:
Value Time
0 15/06/2012 8:03:43 PM
1 15/06/2012 8:03:43 PM *
1 15/06/2012 8:03:48 PM
1 15/06/2012 8:03:53 PM
1 15/06/2012 8:03:58 PM
2 15/06/2012 8:04:03 PM *
2 15/06/2012 8:04:08 PM
3 15/06/2012 8:04:13 PM *
3 15/06/2012 8:04:18 PM
3 15/06/2012 8:04:23 PM
2 15/06/2012 8:04:28 PM *
2 15/06/2012 8:04:33 PM
How do I select the starred rows, that is, where Value
has changed? Basically I'm trying to find the time when Value
has changed so I can do other queries based on those time intervals. The solution shouldn't depend on knowing Value
or Time
in advance.
It seems to me that this shouldn't be very hard (but it's hard enough for me apparently!).
I'm currently using SQL Server 2008 although I have access to 2012 if the new window/analytic functions are helpful.
I tried adapting the solutions here http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/ but my query didn't complete after an hour! I think the joins explode the row size to something unmanageable (or I screwed it up).
I can solve this problem with C# code and multiple db calls, but it seems like something that could be done in a table-valued function or SP which would be much nicer.
Also, a solution that only works with increasing Value
is OK if that is easier.
We can do this using sub queries also
So, I have compared the values of 2 rows if it changes then the difference of rn will be not equal to 1 otherwise rn value will increment by 1 so, I have picked all the rows whose difference with next row's rn value is not 1 and sub2.rn IS NULL is used for the first row because the join will occur from id = 2.
I think this is what you're after:
This may be slow if the resultset is large and there isn't a good supporting index...
EDIT
Ah, wait a second, the values go up and down, not just up... if that is the case you can try this much slower approach:
Results:
Results: