SELECT
[current].rowInt,
[current].Value,
ISNULL([next].Value, 0) - [current].Value
FROM
sourceTable AS [current]
LEFT JOIN
sourceTable AS [next]
ON [next].rowInt = (SELECT MIN(rowInt) FROM sourceTable WHERE rowInt > [current].rowInt)
CHỈNH SỬA:
Nghĩ về điều đó, sử dụng một truy vấn con trong vùng chọn (câu trả lời của ala Quassnoi) có thể hiệu quả hơn. Tôi sẽ dùng thử các phiên bản khác nhau và xem xét các kế hoạch thực thi để xem kế hoạch nào sẽ hoạt động tốt nhất trên kích thước tập dữ liệu mà bạn có ...
EDIT2:
Tôi vẫn thấy điều này thu hút được phiếu bầu, mặc dù không có nhiều người vẫn sử dụng SQL Server 2005.
Nếu bạn có quyền truy cập vào Các chức năng được cửa sổ như LEAD()
, sau đó sử dụng nó thay thế ...
SELECT
RowInt,
Value,
LEAD(Value, 1, 0) OVER (ORDER BY RowInt) - Value
FROM
sourceTable