این توابع واقعا کار رو آسون کردن، ما رو از بکارگیری چندین بار self join بی نیاز کردن.
بطور نمونه اگه بخواهیم مقدار SalesOrderDetailID سطر قبلی، دو سطرقبلی، سطربعدی و دو سطر بعدی را بدست بیاریم در نسخه 2008 سادهترین و مناسبترین کوئری این هست:
WITH cteLead AS ( SELECT SalesOrderID,SalesOrderDetailID,OrderQty, ROW_NUMBER() OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) AS sn FROM TestLead_LAG WHERE SalesOrderID IN (43670, 43669, 43667, 43663) ) SELECT m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty, COALESCE(sLead1.SalesOrderDetailID, 0) as leadvalue1, COALESCE(sLead2.SalesOrderDetailID, 0) as leadvalue2, COALESCE(sLag1.SalesOrderDetailID, 0) as lagvalue2, COALESCE(sLag2.SalesOrderDetailID, 0) as lagvalue2 FROM cteLead AS m LEFT OUTER JOIN cteLead AS sLead1 ON m.sn = sLead1.sn - 1 AND m.SalesOrderID = sLead1.SalesOrderID LEFT OUTER JOIN cteLead AS sLead2 ON m.sn = sLead2.sn - 2 AND m.SalesOrderID = sLead2.SalesOrderID LEFT OUTER JOIN cteLead AS sLag1 ON m.sn = sLag1.sn + 1 AND m.SalesOrderID = sLag1.SalesOrderID LEFT OUTER JOIN cteLead AS sLag2 ON m.sn = sLag2.sn + 2 AND m.SalesOrderID = sLag2.SalesOrderID ORDER BY m.SalesOrderID, m.SalesOrderDetailID, m.OrderQty;
در حالی که با دو تابعی که شما در اینجا پوشش دادین میشه کوئری فوق را فوق العاده سادهتر نمود:
SELECT s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty, Lead(SalesOrderDetailID, 1, 0) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) LeadValue1, LAG(SalesOrderDetailID, 1, 0) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) LAGValue1, Lead(SalesOrderDetailID, 2, 0) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) LeadValue2, LAG(SalesOrderDetailID, 2, 0) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) LAGValue2, FROM TestLead_LAG s WHERE SalesOrderID IN (43670, 43669, 43667, 43663) ORDER BY s.SalesOrderID,s.SalesOrderDetailID,s.OrderQty