<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: SQL SERVER &#8211; Puzzle to Win Print Book &#8211; Write T-SQL Self Join Without Using LEAD and LAG</title>
	<atom:link href="http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/</link>
	<description>SQL, SQL Server, MySQL, Big Data and NoSQL</description>
	<lastBuildDate>Wed, 19 Jun 2013 06:53:59 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: SQL SERVER &#8211; Puzzle to Win Print Book and Free 30 Days Online Training Material &#171; SQL Server Journey with SQL Authority</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-284025</link>
		<dc:creator><![CDATA[SQL SERVER &#8211; Puzzle to Win Print Book and Free 30 Days Online Training Material &#171; SQL Server Journey with SQL Authority]]></dc:creator>
		<pubDate>Sat, 12 May 2012 02:39:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-284025</guid>
		<description><![CDATA[[...]       GA_googleFillSlot(&quot;sqlauthority_728x90&quot;);     &#171; SQL SERVER &#8211; Puzzle to Win Print Book &#8211; Write T-SQL Self Join Without Using LEAD and&amp;nbs... SQL SERVER &#8211; Introduction to PERCENT_RANK() &#8211; Analytic Functions Introduced in SQL [...]]]></description>
		<content:encoded><![CDATA[<p>[...]       GA_googleFillSlot(&quot;sqlauthority_728x90&quot;);     &laquo; SQL SERVER &#8211; Puzzle to Win Print Book &#8211; Write T-SQL Self Join Without Using LEAD and&amp;nbs&#8230; SQL SERVER &#8211; Introduction to PERCENT_RANK() &#8211; Analytic Functions Introduced in SQL [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: SQL SERVER &#8211; Solution to Puzzle &#8211; Simulate LEAD() and LAG() without Using SQL Server 2012 Analytic Function &#171; Journey to SQLAuthority</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-203281</link>
		<dc:creator><![CDATA[SQL SERVER &#8211; Solution to Puzzle &#8211; Simulate LEAD() and LAG() without Using SQL Server 2012 Analytic Function &#171; Journey to SQLAuthority]]></dc:creator>
		<pubDate>Thu, 24 Nov 2011 01:31:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-203281</guid>
		<description><![CDATA[[...] read the puzzle here first before reading the solution : Write T-SQL Self Join Without Using LEAD and LAG. When I was originally wrote the puzzle I had done small blunder and the question was a bit [...]]]></description>
		<content:encoded><![CDATA[<p>[...] read the puzzle here first before reading the solution : Write T-SQL Self Join Without Using LEAD and LAG. When I was originally wrote the puzzle I had done small blunder and the question was a bit [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: SQL SERVER &#8211; 2012 &#8211; Summary of All the Analytic Functions &#8211; MSDN and SQLAuthority &#171; Journey to SQLAuthority</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-202552</link>
		<dc:creator><![CDATA[SQL SERVER &#8211; 2012 &#8211; Summary of All the Analytic Functions &#8211; MSDN and SQLAuthority &#171; Journey to SQLAuthority]]></dc:creator>
		<pubDate>Wed, 23 Nov 2011 01:31:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-202552</guid>
		<description><![CDATA[[...] SQL SERVER – Puzzle to Win Print Book – Write T-SQL Self Join Without Using LEAD and LAG [...]]]></description>
		<content:encoded><![CDATA[<p>[...] SQL SERVER – Puzzle to Win Print Book – Write T-SQL Self Join Without Using LEAD and LAG [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: miteshmca</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-198431</link>
		<dc:creator><![CDATA[miteshmca]]></dc:creator>
		<pubDate>Fri, 18 Nov 2011 08:57:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-198431</guid>
		<description><![CDATA[USE AdventureWorks
GO
;WITH cteSalesOrderDetail AS
(
SELECT s.SalesOrderID,
s.SalesOrderDetailID,
s.OrderQty,
ROW_NUMBER() OVER (ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) AS rownum
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)
SELECT [Current Row].SalesOrderID,
[Current Row].SalesOrderDetailID,
[Current Row].OrderQty,
[Next Row].SalesOrderDetailID AS LeadValue,
[Previous Row].SalesOrderDetailID AS LagVAlue
FROM cteSalesOrderDetail [Current Row]
LEFT JOIN cteSalesOrderDetail [Next Row]
ON [Next Row].rownum = [Current Row].rownum + 1
LEFT JOIN cteSalesOrderDetail [Previous Row]
ON [Previous Row].rownum = [Current Row].rownum - 1]]></description>
		<content:encoded><![CDATA[<p>USE AdventureWorks<br />
GO<br />
;WITH cteSalesOrderDetail AS<br />
(<br />
SELECT s.SalesOrderID,<br />
s.SalesOrderDetailID,<br />
s.OrderQty,<br />
ROW_NUMBER() OVER (ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) AS rownum<br />
FROM Sales.SalesOrderDetail s<br />
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)<br />
SELECT [Current Row].SalesOrderID,<br />
[Current Row].SalesOrderDetailID,<br />
[Current Row].OrderQty,<br />
[Next Row].SalesOrderDetailID AS LeadValue,<br />
[Previous Row].SalesOrderDetailID AS LagVAlue<br />
FROM cteSalesOrderDetail [Current Row]<br />
LEFT JOIN cteSalesOrderDetail [Next Row]<br />
ON [Next Row].rownum = [Current Row].rownum + 1<br />
LEFT JOIN cteSalesOrderDetail [Previous Row]<br />
ON [Previous Row].rownum = [Current Row].rownum &#8211; 1</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brendan</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197740</link>
		<dc:creator><![CDATA[Brendan]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 14:18:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197740</guid>
		<description><![CDATA[I tried a few things, but this seemed to be the cleanest method:


USE AdventureWorks
GO

WITH tmpSalesOrderDetail AS
(
SELECT 
	SalesOrderID, 
	SalesOrderDetailID, 
	OrderQty, 
	ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS rownum
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)

SELECT 
	t.SalesOrderID, 
	t.SalesOrderDetailID, 
	t.OrderQty, 
	t_lead.SalesOrderDetailID AS LeadValue, 
	t_lag.SalesOrderDetailID AS LagValue
FROM tmpSalesOrderDetail t
	LEFT OUTER JOIN tmpSalesOrderDetail t_lead
		ON t.rownum = t_lead.rownum - 1
	LEFT OUTER JOIN tmpSalesOrderDetail t_lag
		ON t.rownum = t_lag.rownum + 1
ORDER BY t.SalesOrderID, t.SalesOrderDetailID, t.OrderQty;]]></description>
		<content:encoded><![CDATA[<p>I tried a few things, but this seemed to be the cleanest method:</p>
<p>USE AdventureWorks<br />
GO</p>
<p>WITH tmpSalesOrderDetail AS<br />
(<br />
SELECT<br />
	SalesOrderID,<br />
	SalesOrderDetailID,<br />
	OrderQty,<br />
	ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) AS rownum<br />
FROM Sales.SalesOrderDetail<br />
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)</p>
<p>SELECT<br />
	t.SalesOrderID,<br />
	t.SalesOrderDetailID,<br />
	t.OrderQty,<br />
	t_lead.SalesOrderDetailID AS LeadValue,<br />
	t_lag.SalesOrderDetailID AS LagValue<br />
FROM tmpSalesOrderDetail t<br />
	LEFT OUTER JOIN tmpSalesOrderDetail t_lead<br />
		ON t.rownum = t_lead.rownum &#8211; 1<br />
	LEFT OUTER JOIN tmpSalesOrderDetail t_lag<br />
		ON t.rownum = t_lag.rownum + 1<br />
ORDER BY t.SalesOrderID, t.SalesOrderDetailID, t.OrderQty;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Geri Reshef</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197710</link>
		<dc:creator><![CDATA[Geri Reshef]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 13:23:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197710</guid>
		<description><![CDATA[I have one without using SQL2012 new functions
And without any Join: 

With T1 As
(Select	Row_Number() Over(Order By SalesOrderDetailID) N,
		s.SalesOrderID,
		s.SalesOrderDetailID,
		s.OrderQty
From Sales.SalesOrderDetail s
Where SalesOrderID IN (43670, 43669, 43667, 43663))
Select	SalesOrderID,SalesOrderDetailID,OrderQty,
		Case When N%2=1 Then Max(Case When N%2=0 Then SalesOrderDetailID End) Over (Partition By (N+1)/2) Else Max(Case When N%2=1 Then SalesOrderDetailID End) Over (Partition By N/2) End LeadVal,
		Case When N%2=1 Then Max(Case When N%2=0 Then SalesOrderDetailID End) Over (Partition By N/2) Else Max(Case When N%2=1 Then SalesOrderDetailID End) Over (Partition By (N+1)/2) End LagVal
From	T1
Order BY SalesOrderID,
		SalesOrderDetailID,
		OrderQty;
Go]]></description>
		<content:encoded><![CDATA[<p>I have one without using SQL2012 new functions<br />
And without any Join: </p>
<p>With T1 As<br />
(Select	Row_Number() Over(Order By SalesOrderDetailID) N,<br />
		s.SalesOrderID,<br />
		s.SalesOrderDetailID,<br />
		s.OrderQty<br />
From Sales.SalesOrderDetail s<br />
Where SalesOrderID IN (43670, 43669, 43667, 43663))<br />
Select	SalesOrderID,SalesOrderDetailID,OrderQty,<br />
		Case When N%2=1 Then Max(Case When N%2=0 Then SalesOrderDetailID End) Over (Partition By (N+1)/2) Else Max(Case When N%2=1 Then SalesOrderDetailID End) Over (Partition By N/2) End LeadVal,<br />
		Case When N%2=1 Then Max(Case When N%2=0 Then SalesOrderDetailID End) Over (Partition By N/2) Else Max(Case When N%2=1 Then SalesOrderDetailID End) Over (Partition By (N+1)/2) End LagVal<br />
From	T1<br />
Order BY SalesOrderID,<br />
		SalesOrderDetailID,<br />
		OrderQty;<br />
Go</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rajkumar</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197690</link>
		<dc:creator><![CDATA[Rajkumar]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 12:43:22 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197690</guid>
		<description><![CDATA[Hi Pinal,

This is my solution to the puzzle.

;with Sales
as
(
SELECT SalesOrderId,SalesOrderDetail,OrderQty,row_number() over(order by salesorderid) as Row FROM SALESORDERDETAIL 
)
select a.SalesOrderId,a.SalesOrderDetail,a.OrderQty,b.SalesOrderDetail As LeadValue,c.SalesOrderDetail As LagValue from sales a
left join Sales b
on a.Row +1 =  b.Row
left join Sales c
on a.Row = c.Row+1

Regards,

Rajkumar,
Bangalore.]]></description>
		<content:encoded><![CDATA[<p>Hi Pinal,</p>
<p>This is my solution to the puzzle.</p>
<p>;with Sales<br />
as<br />
(<br />
SELECT SalesOrderId,SalesOrderDetail,OrderQty,row_number() over(order by salesorderid) as Row FROM SALESORDERDETAIL<br />
)<br />
select a.SalesOrderId,a.SalesOrderDetail,a.OrderQty,b.SalesOrderDetail As LeadValue,c.SalesOrderDetail As LagValue from sales a<br />
left join Sales b<br />
on a.Row +1 =  b.Row<br />
left join Sales c<br />
on a.Row = c.Row+1</p>
<p>Regards,</p>
<p>Rajkumar,<br />
Bangalore.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Madhavan</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197677</link>
		<dc:creator><![CDATA[Madhavan]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 12:15:34 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197677</guid>
		<description><![CDATA[USE AdventureWorks
GO
WITH SalesOrderDetailOrdered as 
(
SELECT s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty, ROW_NUMBER() OVER (ORDER BY  s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) RowNumber
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)

SELECT sbase.SalesOrderID,sbase.SalesOrderDetailID,sbase.OrderQty,slead.SalesOrderDetailID,slag.SalesOrderDetailID 
FROM SalesOrderDetailOrdered sbase 
LEFT OUTER JOIN SalesOrderDetailOrdered slead ON sbase.RowNumber=slead.RowNumber-1
LEFT OUTER JOIN SalesOrderDetailOrdered slag ON sbase.RowNumber=slag.RowNumber+1]]></description>
		<content:encoded><![CDATA[<p>USE AdventureWorks<br />
GO<br />
WITH SalesOrderDetailOrdered as<br />
(<br />
SELECT s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty, ROW_NUMBER() OVER (ORDER BY  s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) RowNumber<br />
FROM Sales.SalesOrderDetail s<br />
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)</p>
<p>SELECT sbase.SalesOrderID,sbase.SalesOrderDetailID,sbase.OrderQty,slead.SalesOrderDetailID,slag.SalesOrderDetailID<br />
FROM SalesOrderDetailOrdered sbase<br />
LEFT OUTER JOIN SalesOrderDetailOrdered slead ON sbase.RowNumber=slead.RowNumber-1<br />
LEFT OUTER JOIN SalesOrderDetailOrdered slag ON sbase.RowNumber=slag.RowNumber+1</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: M.Satyakrishna</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197533</link>
		<dc:creator><![CDATA[M.Satyakrishna]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 07:03:47 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197533</guid>
		<description><![CDATA[2.  When using &quot; partition by &quot;

select a1.salesorderid,a1.salesorderdetailsid,a1.orderqty, 
case a1.salesorderdetailsid
when min(a2.salesorderdetailsid) over (partition by a2.salesorderid) then min(a2.salesorderdetailsid) over (partition by a2.salesorderid)
else
	min(a2.salesorderdetailsid) over (partition by a2.salesorderid)
end 
as FstValue,a2.salesorderdetailsid as LstValue
from adventureworks a1 
inner join adventureworks a2
on a1.salesorderdetailsid=a2.salesorderdetailsid
WHERE a1.salesorderid in (43670,43669,43667,43663)
order by a1.salesorderid,a1.salesorderdetailsid,a1.orderqty]]></description>
		<content:encoded><![CDATA[<p>2.  When using &#8221; partition by &#8221;</p>
<p>select a1.salesorderid,a1.salesorderdetailsid,a1.orderqty,<br />
case a1.salesorderdetailsid<br />
when min(a2.salesorderdetailsid) over (partition by a2.salesorderid) then min(a2.salesorderdetailsid) over (partition by a2.salesorderid)<br />
else<br />
	min(a2.salesorderdetailsid) over (partition by a2.salesorderid)<br />
end<br />
as FstValue,a2.salesorderdetailsid as LstValue<br />
from adventureworks a1<br />
inner join adventureworks a2<br />
on a1.salesorderdetailsid=a2.salesorderdetailsid<br />
WHERE a1.salesorderid in (43670,43669,43667,43663)<br />
order by a1.salesorderid,a1.salesorderdetailsid,a1.orderqty</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Zubair Khalid</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197486</link>
		<dc:creator><![CDATA[Zubair Khalid]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 05:49:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197486</guid>
		<description><![CDATA[Following is the solution for your puzzle without using LEAD and LAG functions

USE AdventureWorks
GO
WITH cteSalesOrderDetail AS
(
	SELECT s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty, ROW_NUMBER() OVER (ORDER BY s.SalesOrderDetailID) AS rownum
	FROM Sales.SalesOrderDetail s WITH(NOLOCK)
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)

SELECT c1.SalesOrderID, c1.SalesOrderDetailID, c1.OrderQty, c2.SalesOrderDetailID AS LeadValue, c3.SalesOrderDetailID AS LagVAlue
FROM cteSalesOrderDetail c1
LEFT JOIN cteSalesOrderDetail c2
ON c1.rownum = c2.rownum – 1
LEFT JOIN cteSalesOrderDetail c3
ON c1.rownum = c3.rownum + 1
ORDER BY c1.SalesOrderID,c1.SalesOrderDetailID,c1.OrderQty]]></description>
		<content:encoded><![CDATA[<p>Following is the solution for your puzzle without using LEAD and LAG functions</p>
<p>USE AdventureWorks<br />
GO<br />
WITH cteSalesOrderDetail AS<br />
(<br />
	SELECT s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty, ROW_NUMBER() OVER (ORDER BY s.SalesOrderDetailID) AS rownum<br />
	FROM Sales.SalesOrderDetail s WITH(NOLOCK)<br />
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)</p>
<p>SELECT c1.SalesOrderID, c1.SalesOrderDetailID, c1.OrderQty, c2.SalesOrderDetailID AS LeadValue, c3.SalesOrderDetailID AS LagVAlue<br />
FROM cteSalesOrderDetail c1<br />
LEFT JOIN cteSalesOrderDetail c2<br />
ON c1.rownum = c2.rownum – 1<br />
LEFT JOIN cteSalesOrderDetail c3<br />
ON c1.rownum = c3.rownum + 1<br />
ORDER BY c1.SalesOrderID,c1.SalesOrderDetailID,c1.OrderQty</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: SIJIN KUMAR V P</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197450</link>
		<dc:creator><![CDATA[SIJIN KUMAR V P]]></dc:creator>
		<pubDate>Thu, 17 Nov 2011 04:48:29 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197450</guid>
		<description><![CDATA[Dear Sir,
 Please have a look on the below query.This will give the required result.


USE AdventureWorks
GO

WITH tempSalesOrderDetail AS
(
   SELECT s.SalesOrderID,
          s.SalesOrderDetailID,
          s.OrderQty,
          ROW_NUMBER() OVER (ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) AS rownum 
   FROM Sales.SalesOrderDetail s
   WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)

SELECT currow.SalesOrderID,
       currow.SalesOrderDetailID,
       currow.OrderQty,
       nextrow.SalesOrderDetailID AS LeadValue,
       prevrow.SalesOrderDetailID AS LagVAlue
FROM tempSalesOrderDetail currow 
      LEFT JOIN tempSalesOrderDetail nextrow
ON currow.rownum = nextrow.rownum - 1
      LEFT JOIN tempSalesOrderDetail prevrow
ON currow.rownum = prevrow.rownum + 1
GO

------------------------------------------------------------------
Sir,
Please correct me, if I&#039;m wrong.

Thanks and Regards,
SIJIN KUMAR V P
INDIA]]></description>
		<content:encoded><![CDATA[<p>Dear Sir,<br />
 Please have a look on the below query.This will give the required result.</p>
<p>USE AdventureWorks<br />
GO</p>
<p>WITH tempSalesOrderDetail AS<br />
(<br />
   SELECT s.SalesOrderID,<br />
          s.SalesOrderDetailID,<br />
          s.OrderQty,<br />
          ROW_NUMBER() OVER (ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty) AS rownum<br />
   FROM Sales.SalesOrderDetail s<br />
   WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)</p>
<p>SELECT currow.SalesOrderID,<br />
       currow.SalesOrderDetailID,<br />
       currow.OrderQty,<br />
       nextrow.SalesOrderDetailID AS LeadValue,<br />
       prevrow.SalesOrderDetailID AS LagVAlue<br />
FROM tempSalesOrderDetail currow<br />
      LEFT JOIN tempSalesOrderDetail nextrow<br />
ON currow.rownum = nextrow.rownum &#8211; 1<br />
      LEFT JOIN tempSalesOrderDetail prevrow<br />
ON currow.rownum = prevrow.rownum + 1<br />
GO</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Sir,<br />
Please correct me, if I&#8217;m wrong.</p>
<p>Thanks and Regards,<br />
SIJIN KUMAR V P<br />
INDIA</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Pradeep Kumar Gupta</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197133</link>
		<dc:creator><![CDATA[Pradeep Kumar Gupta]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 19:20:20 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197133</guid>
		<description><![CDATA[Great Solution]]></description>
		<content:encoded><![CDATA[<p>Great Solution</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: DHall</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-197047</link>
		<dc:creator><![CDATA[DHall]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 17:16:24 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-197047</guid>
		<description><![CDATA[Here&#039;s a variation of my comment yesterday. This one includes the PARTITION BY behavior in addition to support for the 2nd and 3rd optional parameters for LEAD() and LAG()

/* a query to emulate LEAD() and LAG() */
;with s as (
select
        0 as LeadOffset,    /* equiv to 2nd param of LEAD */
        0 as LagOffset,     /* equiv to 2nd param of LAG  */
        null as LeadDefVal, /* equiv to 3rd param of LEAD */
        null as LagDefVal,  /* equiv to 3rd param of LAG  */
        /* Try changing the values of the 4 integer values above to see their effect on the results */
        /* The values given above of 0, 0, null and null 
            behave the same as the default 2nd and 3rd parameters to LEAD() and LAG() */
        ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) as row,
        SalesOrderID,
        SalesOrderDetailID,
        OrderQty
from Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)
SELECT  s.SalesOrderID,
        s.SalesOrderDetailID,
        s.OrderQty,
        isnull( sLead.SalesOrderDetailID, s.LeadDefVal) as LeadValue,
        isnull( sLag.SalesOrderDetailID,  s.LagDefVal)  as LagValue
FROM s
left outer join s as sLead 
    on s.row = sLead.row - s.LeadOffset
    /* Try commenting out this next line when LeadOffset != 0 */
    and s.SalesOrderID = sLead.SalesOrderID  
    /* The additional join criteria on SalesOrderID above
    is equivalent to PARTITION BY SalesOrderID 
    in the OVER clause of the LEAD() function */
left outer join s as sLag 
    on s.row = sLag.row + s.LagOffset
    /* Try commenting out this next line when LagOffset != 0 */
    and s.SalesOrderID = sLag.SalesOrderID 
    /* The additional join criteria on SalesOrderID above
    is equivalent to PARTITION BY SalesOrderID 
    in the OVER clause of the LAG() function */
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty]]></description>
		<content:encoded><![CDATA[<p>Here&#8217;s a variation of my comment yesterday. This one includes the PARTITION BY behavior in addition to support for the 2nd and 3rd optional parameters for LEAD() and LAG()</p>
<p>/* a query to emulate LEAD() and LAG() */<br />
;with s as (<br />
select<br />
        0 as LeadOffset,    /* equiv to 2nd param of LEAD */<br />
        0 as LagOffset,     /* equiv to 2nd param of LAG  */<br />
        null as LeadDefVal, /* equiv to 3rd param of LEAD */<br />
        null as LagDefVal,  /* equiv to 3rd param of LAG  */<br />
        /* Try changing the values of the 4 integer values above to see their effect on the results */<br />
        /* The values given above of 0, 0, null and null<br />
            behave the same as the default 2nd and 3rd parameters to LEAD() and LAG() */<br />
        ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) as row,<br />
        SalesOrderID,<br />
        SalesOrderDetailID,<br />
        OrderQty<br />
from Sales.SalesOrderDetail<br />
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)<br />
SELECT  s.SalesOrderID,<br />
        s.SalesOrderDetailID,<br />
        s.OrderQty,<br />
        isnull( sLead.SalesOrderDetailID, s.LeadDefVal) as LeadValue,<br />
        isnull( sLag.SalesOrderDetailID,  s.LagDefVal)  as LagValue<br />
FROM s<br />
left outer join s as sLead<br />
    on s.row = sLead.row &#8211; s.LeadOffset<br />
    /* Try commenting out this next line when LeadOffset != 0 */<br />
    and s.SalesOrderID = sLead.SalesOrderID<br />
    /* The additional join criteria on SalesOrderID above<br />
    is equivalent to PARTITION BY SalesOrderID<br />
    in the OVER clause of the LEAD() function */<br />
left outer join s as sLag<br />
    on s.row = sLag.row + s.LagOffset<br />
    /* Try commenting out this next line when LagOffset != 0 */<br />
    and s.SalesOrderID = sLag.SalesOrderID<br />
    /* The additional join criteria on SalesOrderID above<br />
    is equivalent to PARTITION BY SalesOrderID<br />
    in the OVER clause of the LAG() function */<br />
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: M.Satyakrishna</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196941</link>
		<dc:creator><![CDATA[M.Satyakrishna]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 14:29:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196941</guid>
		<description><![CDATA[Hi Dave,
This is my trail please have a look at it

1.

SELECT  a1.salesorderid,
a1.salesorderdetailsid,
a1.orderqty,
min(a2.salesorderdetailsid) over () as FstValue,
a2.salesorderdetailsid as LstValue
FROM adventureworks a1 
INNER JOIN adventureworks a2
ON a1.salesorderdetailsid=a2.salesorderdetailsid
WHERE a1.salesorderid in (43670,43669,43667,43663)
ORDER BY a1.salesorderid,a1.salesorderdetailsid,a1.orderqty 

SalesOrderId    SalesOrderDetailsId    OrderQty     FstValue    LstValue
_________________________________________________________
43663	                52                        	1	             52	    52
43667              	77                      	3                   52           77
43667	                78                       	1                   52           78
43667                   	79                     	1                   52           79
43667	                80	                        1	             52	    80
43669	                110	                        1	             52	    110
43670                    	111	                        1	             52	    111
43670	                112	                        2                   52           112
43670	                113	                        2           	     52    	    113
43670	                114	                        1	             52	    114
___________________________________________________________

2. When use the same thing with PARTITION BY 

SalesOrderId    SalesOrderDetailsId    OrderQty     FstValue    LstValue
___________________________________________________________

43663	                 52	                         1	              52	      52
43667	                 77	                         3	              77	      77
43667	                 78	                         1	              77	      78
43667	                 79	                         1	              77	      79
43667	                 80	                         1	              77	      80
43669	                 110	                         1	              110	      110
43670	                 111	                         1	              111	      111
43670	                 112	                         2	              111	      112
43670	                 113	                         2	              111	      113
43670	                 114	                         1	              111	      114
___________________________________________________________]]></description>
		<content:encoded><![CDATA[<p>Hi Dave,<br />
This is my trail please have a look at it</p>
<p>1.</p>
<p>SELECT  a1.salesorderid,<br />
a1.salesorderdetailsid,<br />
a1.orderqty,<br />
min(a2.salesorderdetailsid) over () as FstValue,<br />
a2.salesorderdetailsid as LstValue<br />
FROM adventureworks a1<br />
INNER JOIN adventureworks a2<br />
ON a1.salesorderdetailsid=a2.salesorderdetailsid<br />
WHERE a1.salesorderid in (43670,43669,43667,43663)<br />
ORDER BY a1.salesorderid,a1.salesorderdetailsid,a1.orderqty </p>
<p>SalesOrderId    SalesOrderDetailsId    OrderQty     FstValue    LstValue<br />
_________________________________________________________<br />
43663	                52                        	1	             52	    52<br />
43667              	77                      	3                   52           77<br />
43667	                78                       	1                   52           78<br />
43667                   	79                     	1                   52           79<br />
43667	                80	                        1	             52	    80<br />
43669	                110	                        1	             52	    110<br />
43670                    	111	                        1	             52	    111<br />
43670	                112	                        2                   52           112<br />
43670	                113	                        2           	     52    	    113<br />
43670	                114	                        1	             52	    114<br />
___________________________________________________________</p>
<p>2. When use the same thing with PARTITION BY </p>
<p>SalesOrderId    SalesOrderDetailsId    OrderQty     FstValue    LstValue<br />
___________________________________________________________</p>
<p>43663	                 52	                         1	              52	      52<br />
43667	                 77	                         3	              77	      77<br />
43667	                 78	                         1	              77	      78<br />
43667	                 79	                         1	              77	      79<br />
43667	                 80	                         1	              77	      80<br />
43669	                 110	                         1	              110	      110<br />
43670	                 111	                         1	              111	      111<br />
43670	                 112	                         2	              111	      112<br />
43670	                 113	                         2	              111	      113<br />
43670	                 114	                         1	              111	      114<br />
___________________________________________________________</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: pinaldave</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196832</link>
		<dc:creator><![CDATA[pinaldave]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 12:05:49 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196832</guid>
		<description><![CDATA[Apology for confusion the original post is fixed.]]></description>
		<content:encoded><![CDATA[<p>Apology for confusion the original post is fixed.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vinay Kumar</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196758</link>
		<dc:creator><![CDATA[Vinay Kumar]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 10:39:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196758</guid>
		<description><![CDATA[Hi, plz check below query. This will show result as you like.

SELECT SalesOrderID,SalesOrderDetailID, OrderQty,
(	SELECT MIN(SalesOrderDetailID) AS FirstValue
	FROM Sales.SalesOrderDetail	WHERE SalesOrderID IN (43670, 43669, 43667, 43663) 
)AS FirstValue
,SalesOrderDetailID AS LastValue
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)


Vinay]]></description>
		<content:encoded><![CDATA[<p>Hi, plz check below query. This will show result as you like.</p>
<p>SELECT SalesOrderID,SalesOrderDetailID, OrderQty,<br />
(	SELECT MIN(SalesOrderDetailID) AS FirstValue<br />
	FROM Sales.SalesOrderDetail	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)AS FirstValue<br />
,SalesOrderDetailID AS LastValue<br />
FROM Sales.SalesOrderDetail<br />
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)</p>
<p>Vinay</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: P.Anish Shenoy</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196658</link>
		<dc:creator><![CDATA[P.Anish Shenoy]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 07:18:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196658</guid>
		<description><![CDATA[Hi Sir,

bit confused over the blog puzzle question and the required answer.

However to execute the result same as lead and lag function using self join, i wrote the following query

USE AdventureWorks

DROP TABLE #TempSalesOrderDetail

CREATE TABLE #TempSalesOrderDetail															
		(														
			 Rownumber INT
			,LEAD INT
			,LAG INT
			,SalesOrderID INT
			,SalesOrderDetailID INT
			,OrderQty INT
		)
				 
INSERT INTO #TempSalesOrderDetail
SELECT ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)
      ,ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)-1
      ,ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)+1
      ,s.SalesOrderID
      ,s.SalesOrderDetailID
      ,s.OrderQty
FROM Sales.SalesOrderDetail s
WHERE S.SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty

SELECT	A.SalesOrderID
       ,A.SalesOrderDetailID
       ,A.OrderQty
       ,B.SalesOrderDetailID AS Lead 
       ,C.SalesOrderDetailID AS Lag
FROM #TempSalesOrderDetail AS A
LEFT JOIN #TempSalesOrderDetail AS B ON A.Rownumber = B.LEAD
LEFT JOIN #TempSalesOrderDetail AS C ON A.Rownumber = C.LAG

The output will be similar to the blog post on Lead and Lag functions described yesterday.


Thanks and Regards,
P.Anish Shenoy.]]></description>
		<content:encoded><![CDATA[<p>Hi Sir,</p>
<p>bit confused over the blog puzzle question and the required answer.</p>
<p>However to execute the result same as lead and lag function using self join, i wrote the following query</p>
<p>USE AdventureWorks</p>
<p>DROP TABLE #TempSalesOrderDetail</p>
<p>CREATE TABLE #TempSalesOrderDetail<br />
		(<br />
			 Rownumber INT<br />
			,LEAD INT<br />
			,LAG INT<br />
			,SalesOrderID INT<br />
			,SalesOrderDetailID INT<br />
			,OrderQty INT<br />
		)</p>
<p>INSERT INTO #TempSalesOrderDetail<br />
SELECT ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)<br />
      ,ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)-1<br />
      ,ROW_NUMBER() OVER (ORDER BY S.SalesOrderID)+1<br />
      ,s.SalesOrderID<br />
      ,s.SalesOrderDetailID<br />
      ,s.OrderQty<br />
FROM Sales.SalesOrderDetail s<br />
WHERE S.SalesOrderID IN (43670, 43669, 43667, 43663)<br />
ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty</p>
<p>SELECT	A.SalesOrderID<br />
       ,A.SalesOrderDetailID<br />
       ,A.OrderQty<br />
       ,B.SalesOrderDetailID AS Lead<br />
       ,C.SalesOrderDetailID AS Lag<br />
FROM #TempSalesOrderDetail AS A<br />
LEFT JOIN #TempSalesOrderDetail AS B ON A.Rownumber = B.LEAD<br />
LEFT JOIN #TempSalesOrderDetail AS C ON A.Rownumber = C.LAG</p>
<p>The output will be similar to the blog post on Lead and Lag functions described yesterday.</p>
<p>Thanks and Regards,<br />
P.Anish Shenoy.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nikhildas</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196650</link>
		<dc:creator><![CDATA[Nikhildas]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 07:02:54 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196650</guid>
		<description><![CDATA[Dear Pinal Sir,

Yesterday your blog article was saying about LEAD or LAG functions. That&#039;s right, but the sample query you are used with FIRST_VALUE and LAST_VALUE  for today&#039;s puzzle.

I&#039;m confused.. expecting your reply..

Thanks and regards,

Nikhildas]]></description>
		<content:encoded><![CDATA[<p>Dear Pinal Sir,</p>
<p>Yesterday your blog article was saying about LEAD or LAG functions. That&#8217;s right, but the sample query you are used with FIRST_VALUE and LAST_VALUE  for today&#8217;s puzzle.</p>
<p>I&#8217;m confused.. expecting your reply..</p>
<p>Thanks and regards,</p>
<p>Nikhildas</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Pravin Patel</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196633</link>
		<dc:creator><![CDATA[Pravin Patel]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 06:35:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196633</guid>
		<description><![CDATA[Hi Pinal,

I think there is some typo error as the article refer Lead(), Leag() function and the sample query you provided is referring to First_Value(), Last_value() function. 

I have written query that gives Lead value and Leag value using self join.,

--CTE based solution

;
with cteMain 
As
(
	select
		SalesOrderID,
		SalesOrderDetailID,
		OrderQty,
		ROW_NUMBER() over (order by salesorderdetailid) as sn
	from 
		Sales.SalesOrderDetail
	WHERE 
		SalesOrderID IN (43670, 43669, 43667, 43663)
)

select 
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty,
	sLead.SalesOrderDetailID as leadvalue,
	sLeg.SalesOrderDetailID as leagvalue
	
from 
	cteMain as m
left outer join cteMain as sLead
	on sLead.sn = m.sn+1
left outer join cteMain as sLeg
	on sLeg.sn = m.sn-1
order by 
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty  	
	
-- The same can be achieved using Co-Related subquery...	
	
select
	m.SalesOrderID,
	m.SalesOrderDetailID,
	m.OrderQty,
	( select MIN(salesorderdetailid)
	  from Sales.SalesOrderDetail as l
	  where l.SalesOrderID in (43670, 43669, 43667, 43663)
	  and l.SalesOrderID &gt;= m.SalesOrderID and l.SalesOrderDetailID &gt; m.SalesOrderDetailID 
	) as lead,
	
	( select MAX(salesorderdetailid)
	  from Sales.SalesOrderDetail as l
	  where l.SalesOrderID in (43670, 43669, 43667, 43663)
	  and l.SalesOrderID &lt;= m.SalesOrderID and l.SalesOrderDetailID &lt; m.SalesOrderDetailID 
	) as leag
	
from 
	Sales.SalesOrderDetail as m
where 
	m.SalesOrderID in (43670, 43669, 43667, 43663)	
order by 
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty  	

Thanks,
Pravin Patel.]]></description>
		<content:encoded><![CDATA[<p>Hi Pinal,</p>
<p>I think there is some typo error as the article refer Lead(), Leag() function and the sample query you provided is referring to First_Value(), Last_value() function. </p>
<p>I have written query that gives Lead value and Leag value using self join.,</p>
<p>&#8211;CTE based solution</p>
<p>;<br />
with cteMain<br />
As<br />
(<br />
	select<br />
		SalesOrderID,<br />
		SalesOrderDetailID,<br />
		OrderQty,<br />
		ROW_NUMBER() over (order by salesorderdetailid) as sn<br />
	from<br />
		Sales.SalesOrderDetail<br />
	WHERE<br />
		SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)</p>
<p>select<br />
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty,<br />
	sLead.SalesOrderDetailID as leadvalue,<br />
	sLeg.SalesOrderDetailID as leagvalue</p>
<p>from<br />
	cteMain as m<br />
left outer join cteMain as sLead<br />
	on sLead.sn = m.sn+1<br />
left outer join cteMain as sLeg<br />
	on sLeg.sn = m.sn-1<br />
order by<br />
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty  	</p>
<p>&#8211; The same can be achieved using Co-Related subquery&#8230;	</p>
<p>select<br />
	m.SalesOrderID,<br />
	m.SalesOrderDetailID,<br />
	m.OrderQty,<br />
	( select MIN(salesorderdetailid)<br />
	  from Sales.SalesOrderDetail as l<br />
	  where l.SalesOrderID in (43670, 43669, 43667, 43663)<br />
	  and l.SalesOrderID &gt;= m.SalesOrderID and l.SalesOrderDetailID &gt; m.SalesOrderDetailID<br />
	) as lead,</p>
<p>	( select MAX(salesorderdetailid)<br />
	  from Sales.SalesOrderDetail as l<br />
	  where l.SalesOrderID in (43670, 43669, 43667, 43663)<br />
	  and l.SalesOrderID &lt;= m.SalesOrderID and l.SalesOrderDetailID &lt; m.SalesOrderDetailID<br />
	) as leag</p>
<p>from<br />
	Sales.SalesOrderDetail as m<br />
where<br />
	m.SalesOrderID in (43670, 43669, 43667, 43663)<br />
order by<br />
	m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty  	</p>
<p>Thanks,<br />
Pravin Patel.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: DHall</title>
		<link>http://blog.sqlauthority.com/2011/11/16/sql-server-puzzle-to-win-print-book-write-t-sql-self-join-without-using-first-_value-and-last_value/#comment-196511</link>
		<dc:creator><![CDATA[DHall]]></dc:creator>
		<pubDate>Wed, 16 Nov 2011 03:09:01 +0000</pubDate>
		<guid isPermaLink="false">http://blog.sqlauthority.com/?p=15845#comment-196511</guid>
		<description><![CDATA[Your article and the puzzle say they refer to LEAD() and LAG() from yesterday&#039;s post, but the sample query and results use FIRST_VALUE() and LAST_VALUE(). I&#039;m not sure which set of functions you want to simulate in your puzzle. Here are two queries that I believe emulate the desired functionality for either pair of functions. Although you didn&#039;t ask for it in the puzzle, the second of these two queries also supports the equivalent of the optional 2nd and 3rd parameters of LEAD() and LAG(). 

-- a query to emulate FIRST_VALUE() and LAST_VALUE()
;with s as (
	select 
		SalesOrderID,
		SalesOrderDetailID,
		OrderQty
	from Sales.SalesOrderDetail
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)
SELECT s.SalesOrderID,
	s.SalesOrderDetailID,
	s.OrderQty,
	(select top 1 SalesOrderDetailID 
	from s order BY SalesOrderDetailID ) as FstValue,
	s.SalesOrderDetailID as LstValue
FROM s
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty

-- a query to emulate LEAD() and LAG()
;with s as (
	select 
		0 as ldOffset, -- equiv to 2nd param of LEAD
		0 as lgOffset, -- equiv to 2nd param of LAG
		null as ldDefVal, -- equiv to 3rd param of LEAD
		null as lgDefVal, -- equiv to 3rd param of LAG
		ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) as row,
		SalesOrderID,
		SalesOrderDetailID,
		OrderQty
	from Sales.SalesOrderDetail
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
)
SELECT	s.SalesOrderID,
		s.SalesOrderDetailID,
		s.OrderQty,
		isnull( sLd.SalesOrderDetailID, s.LdDefVal) as LeadValue,
		isnull( sLg.SalesOrderDetailID, s.LgDefVal) as LagValue
FROM s 
left outer join s as sLd on s.row = sLd.row - s.ldOffset
left outer join s as sLg on s.row = sLg.row + s.lgOffset
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty]]></description>
		<content:encoded><![CDATA[<p>Your article and the puzzle say they refer to LEAD() and LAG() from yesterday&#8217;s post, but the sample query and results use FIRST_VALUE() and LAST_VALUE(). I&#8217;m not sure which set of functions you want to simulate in your puzzle. Here are two queries that I believe emulate the desired functionality for either pair of functions. Although you didn&#8217;t ask for it in the puzzle, the second of these two queries also supports the equivalent of the optional 2nd and 3rd parameters of LEAD() and LAG(). </p>
<p>&#8211; a query to emulate FIRST_VALUE() and LAST_VALUE()<br />
;with s as (<br />
	select<br />
		SalesOrderID,<br />
		SalesOrderDetailID,<br />
		OrderQty<br />
	from Sales.SalesOrderDetail<br />
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)<br />
SELECT s.SalesOrderID,<br />
	s.SalesOrderDetailID,<br />
	s.OrderQty,<br />
	(select top 1 SalesOrderDetailID<br />
	from s order BY SalesOrderDetailID ) as FstValue,<br />
	s.SalesOrderDetailID as LstValue<br />
FROM s<br />
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty</p>
<p>&#8211; a query to emulate LEAD() and LAG()<br />
;with s as (<br />
	select<br />
		0 as ldOffset, &#8212; equiv to 2nd param of LEAD<br />
		0 as lgOffset, &#8212; equiv to 2nd param of LAG<br />
		null as ldDefVal, &#8212; equiv to 3rd param of LEAD<br />
		null as lgDefVal, &#8212; equiv to 3rd param of LAG<br />
		ROW_NUMBER() OVER (ORDER BY SalesOrderDetailID) as row,<br />
		SalesOrderID,<br />
		SalesOrderDetailID,<br />
		OrderQty<br />
	from Sales.SalesOrderDetail<br />
	WHERE SalesOrderID IN (43670, 43669, 43667, 43663)<br />
)<br />
SELECT	s.SalesOrderID,<br />
		s.SalesOrderDetailID,<br />
		s.OrderQty,<br />
		isnull( sLd.SalesOrderDetailID, s.LdDefVal) as LeadValue,<br />
		isnull( sLg.SalesOrderDetailID, s.LgDefVal) as LagValue<br />
FROM s<br />
left outer join s as sLd on s.row = sLd.row &#8211; s.ldOffset<br />
left outer join s as sLg on s.row = sLg.row + s.lgOffset<br />
ORDER BY s.SalesOrderID, s.SalesOrderDetailID, s.OrderQty</p>
]]></content:encoded>
	</item>
</channel>
</rss>
