Đối với SQL Server 2012+:
Bạn có thể sử dụng LAG
chức năng.
Đây là một ví dụ để tìm giá trị đã nhận trước đó, tất nhiên những giá trị khác sẽ khá giống nhau.
SELECT TOP 5
ReceivedYTD,
InvoicedYTD,
OrderedYTD,
YearReported,
WeekReported,
-- Relevant part
LAG(ReceivedYTD)
OVER (ORDER BY YearReported DESC, WeekReported DESC) AS PreviousReceivedYTD
-- End relevant part
FROM Products
WHERE ProductId = @ProductId
ORDER BY YearReported DESC,
WeekReported DESC
Nếu không
Tôi đã hiểu rõ câu trả lời này trước khi bạn nhận xét lại, vì vậy tôi chỉ tiếp tục với nó.
Bạn phải sử dụng một CTE và kết hợp nó với chính nó bằng phần bù số hàng mà bạn đang tìm kiếm.
WITH CTE AS (
SELECT TOP 5
RowNumber = ROW_NUMBER() OVER (ORDER BY YearReported DESC, WeekReported DESC)
ReceivedYTD,
InvoicedYTD,
OrderedYTD,
YearReported,
WeekReported,
FROM Products
WHERE ProductId = @ProductId
ORDER BY YearReported DESC,
WeekReported DESC
)
SELECT CTE.ReceivedYTD,
CTE.InvoicedYTD,
CTE.OrderedYTD,
CTE.YearReported,
CTE.WeekReported,
PreviousRow.ReceivedYTD AS PreviousReceivedYTD
FROM CTE
LEFT OUTER JOIN CTE PreviousRow ON CTE.RowNumber - 1 = PreviousRow.RowNumber