Author Message Tom Thomson SSC Guru Group: General Forum Members Points: 50686 Visits: 13159 mbova407 (11/12/2012)Thanks for the questionWill someone please explain example C in english`CREATE TABLE T (a int, b int, c int); GOINSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5); SELECT b, c, LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS iFROM T;`I am very confused over the first parameter 2*cIt's very easy: 2*c is just what it says - the value in column c multiplied by 2. Which row supplies the value of c that is to be multiplied by 2? The row that is b*(select min(b)) rows ahead of the current row (the value of b used for that is of course the value in the current row; if 2*c calculated by those rules is NULL, the value -c/2.0 (where this time c is taken from the current row) is to be (implicitly converted to an integer and) used instead of that NULL.More generally, the three arguments of LEAD are treated as follows:The second and third arguments are expressions where any unqualified row names (or row names using the source table & schama names as qualifers) that are not bound in an aggregate refer to the current row. The first argument is an expression where those unbound column names refer to the row that leads the current row by the number which the second argument evaluates to. The third argument doesn't need to be evaluated unless evaluating the second argument and then the first argument leads to NULL for the first argument, but there's no guarantee that it won't be evaluated even when its value isn't needed. The other two arguments always have to be evaluated, and the first argument can't be evaluated until the second argument has been evaluated, because until then one doesn't know which row the free column names in it refer to. Tom Mike Is Here SSCrazy Group: General Forum Members Points: 2420 Visits: 517 L' Eomot Inversé (11/12/2012)mbova407 (11/12/2012)Thanks for the questionWill someone please explain example C in english`CREATE TABLE T (a int, b int, c int); GOINSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5); SELECT b, c, LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS iFROM T;`I am very confused over the first parameter 2*cIt's very easy: 2*c is just what it says - the value in column c multiplied by 2. Which row supplies the value of c that is to be multiplied by 2? The row that is b*(select min(b)) rows ahead of the current row (the value of b used for that is of course the value in the current row; if 2*c calculated by those rules is NULL, the value -c/2.0 (where this time c is taken from the current row) is to be (implicitly converted to an integer and) used instead of that NULL.More generally, the three arguments of LEAD are treated as follows:The second and third arguments are expressions where any unqualified row names (or row names using the source table & schama names as qualifers) that are not bound in an aggregate refer to the current row. The first argument is an expression where those unbound column names refer to the row that leads the current row by the number which the second argument evaluates to. The third argument doesn't need to be evaluated unless evaluating the second argument and then the first argument leads to NULL for the first argument, but there's no guarantee that it won't be evaluated even when its value isn't needed. The other two arguments always have to be evaluated, and the first argument can't be evaluated until the second argument has been evaluated, because until then one doesn't know which row the free column names in it refer to.Thanks for the effort but I am still missing it.So for the first row C=-3 b=1 (and min b in the table is 1)so -3*2=-6 the offset is 1*1 So Lead(-6,1,-3/2) = 8?----------------------------------Actually I just got it its not Lead(c*2,b*min(b),-c/2) but the value to be returned based on the specified offset But it is Lead(C value of the row + the offset (not the current row), the calculated offset of the current row value of B, default to the current row value of C if the first parameter is null) Mike Is Here SSCrazy Group: General Forum Members Points: 2420 Visits: 517 The first argument is an expression where those unbound column names refer to the row that leads the current row by the number which the second argument evaluates to. That is what you said SQLRNNR SSC Guru Group: General Forum Members Points: 144433 Visits: 18651 Another solid question Ron. Jason...AKA CirqueDeSQLeil_______________________________________________I have given a name to my pain...MCM SQL Server, MVPSQL RNNRPosting Performance Based Questions - Gail ShawLearn Extended Events Andre Ranieri UDP Broadcaster Group: General Forum Members Points: 1455 Visits: 379 Cool question, this makes me want to get my hands on a SQL 2012 server