Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để có được sự khác biệt giữa hai hàng cho một trường cột?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hoàn nguyên giao dịch Entity Framework 6

  2. Khắc phục “Ít nhất một trong các đối số đối với COALESCE phải là một biểu thức không phải là hằng số NULL” trong SQL Server

  3. Làm thế nào để xử lý vệ sinh thoát khỏi các dấu ngoặc kép có thể bị đánh bại bởi SQL injection trong SQL Server?

  4. Các biến phân biệt chữ hoa chữ thường trong SQL Server

  5. TSQL:Tạo một dạng xem truy cập nhiều cơ sở dữ liệu