Các phiên bản SQL Server 2012 của FIRST () và LAST () là gì?


10

Tôi có một bảng với một valuecột. Tôi muốn tính hàng cuối cùng trừ hàng đầu tiên, như được hiển thị ở đây:

 id      value
  1       10
  2       45
  3       65
  4       95
  .       .
  .       .
  .       .
 500     200

Tôi muốn có được 200 - 10 = 190

Tuy nhiên, tôi đã thử sử dụng lệnh dưới đây trong SQL Server 2012 LASTFIRSTkhông hoạt động.

SELECT LAST(Value) - FIRST(Value) FROM Counter;

Cú pháp của lệnh này trong SQL Server là gì?


@ mohammad2050 - vấn đề là làm thế nào để bạn xác định hàng "đầu tiên" và "cuối cùng". Có một số cột khác xác định thứ tự nên là gì? Chẳng hạn, có một IDENTITYcột hoặc có lẽ là một DATETIMEcột xác định các hàng "đầu tiên" và "cuối cùng" là gì?
Max Vernon

1
vâng, tôi có cột id là 1 đến cuối cùng và là cột IDENTITY và tăng Max để chỉnh sửa vấn đề của tôi
mohammad2050

Câu trả lời:


20

Bạn đã gần - FIRSTLASTđến từ Access; trong SQL Server (bắt đầu với SQL Server 2012), chúng là FIRST_VALUE()LAST_VALUE().

Vì vậy, nếu bạn là 2012 hoặc tốt hơn (hoặc Cơ sở dữ liệu Azure SQL), đây là một cách để có câu trả lời của bạn:

CREATE TABLE #fl
(
  IdentityColumn INT IDENTITY, 
  Value INT
);

INSERT #fl(Value) SELECT 10;
INSERT #fl(Value) SELECT 45;
INSERT #fl(Value) SELECT 65;
INSERT #fl(Value) SELECT 95;
INSERT #fl(Value) SELECT 200;

SELECT TOP (1) LAST_VALUE(Value) OVER (ORDER BY IdentityColumn)
            - FIRST_VALUE(Value) OVER (ORDER BY IdentityColumn)
  FROM #fl
  ORDER BY IdentityColumn DESC;

GO
DROP TABLE #fl;

9

Một cách nữa (cũng hoạt động trong các phiên bản cũ hơn):

SELECT 
    result = (SELECT TOP (1) value FROM counter ORDER BY id DESC)
             - (SELECT TOP (1) value FROM counter ORDER BY id ASC) ;

1

Đây là một cách bạn có thể làm điều đó:

USE tempdb;

CREATE TABLE dbo.Test1
(
    ID INT NOT NULL
        CONSTRAINT PK_Test1 
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , Val INT NOT NULL
);
INSERT INTO dbo.Test1 (Val)
VALUES (1)
    , (2)
    , (3)
    , (50);

;WITH FirstAndLast
AS (
    SELECT t.ID
        , t.Val
        , RN  = ROW_NUMBER() OVER (ORDER BY ID)
        , RND = ROW_NUMBER() OVER (ORDER BY ID DESC)
    FROM dbo.Test1 t
)
SELECT TOP(1) l.Val - f.val
FROM FirstAndLast f
    INNER JOIN FirstAndLast l ON f.RN = l.RND

Ý tưởng ở đây là xác định các hàng "đầu tiên" và "cuối cùng". Một khi bạn đã xác định chúng, bạn chỉ cần thực hiện phép trừ.


-2

Tại sao không sử dụng Hàm MAX và Min (Tùy chọn nếu bạn có Tiêu chí sử dụng ở đâu)

Ví dụ. Chọn (Max (NumFieldName) - Min (NumFieldName)) AS đầu ra TỪ TableName


1
Không có gì đảm bảo rằng Valuecột luôn tăng. Cột nhận dạng là, tuy nhiên.
RDFozz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.