Recent PostsRecent Posts Popular TopicsPopular Topics
 Home Search Members Calendar Who's On

 Lead - 2 Rate Topic Display Mode Topic Options
Author
 Message
 Posted Monday, November 12, 2012 8:39 PM
 SSCrazy Eights Group: General Forum Members Last Login: Yesterday @ 2:14 PM Points: 9,833, Visits: 11,907
 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
Post #1383931
 Posted Tuesday, November 13, 2012 7:55 AM
 Ten Centuries Group: General Forum Members Last Login: Tuesday, November 15, 2016 7:08 AM Points: 1,402, Visits: 513
 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)
Post #1384111
 Posted Tuesday, November 13, 2012 7:57 AM
 Ten Centuries Group: General Forum Members Last Login: Tuesday, November 15, 2016 7:08 AM Points: 1,402, Visits: 513
 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
Post #1384113
 Posted Tuesday, November 13, 2012 2:35 PM
 SSC-Insane Group: General Forum Members Last Login: Yesterday @ 2:52 PM Points: 20,083, Visits: 18,257
 Another solid question Ron. Jason AKA CirqueDeSQLeilI have given a name to my pain...MCM SQL Server, MVPSQL RNNRPosting Performance Based Questions - Gail Shaw
Post #1384308
 Posted Friday, November 23, 2012 8:56 AM
 SSC-Addicted Group: General Forum Members Last Login: Friday, October 9, 2015 3:12 PM Points: 479, Visits: 379
 Cool question, this makes me want to get my hands on a SQL 2012 server :)
Post #1388190

 Permissions