Apa versi SQL Server 2012 dari FIRST () dan LAST ()?


10

Saya punya meja dengan valuekolom. Saya ingin menghitung baris terakhir dikurangi baris pertama, seperti yang ditunjukkan di sini:

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

Saya ingin mendapatkan 200 - 10 = 190

Saya sudah mencoba menggunakan perintah di bawah ini di SQL Server 2012, namun LASTdan FIRSTtidak berhasil.

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

Apa sintaks untuk perintah ini di SQL Server?


@ mohammad2050 - masalahnya adalah bagaimana Anda mendefinisikan baris "pertama" dan "terakhir". Apakah ada kolom lain yang menentukan apa yang seharusnya dipesan? Misalnya, apakah ada IDENTITYkolom atau mungkin DATETIMEkolom yang mendefinisikan apa baris "pertama" dan "terakhir"?
Max Vernon

1
ya, saya memiliki kolom id yaitu 1 untuk bertahan dan kolom IDENTITY dan tank Max untuk mengedit masalah saya
mohammad2050

Jawaban:


20

Anda dekat - FIRSTdan LASTberasal dari Access; di SQL Server (dimulai dengan SQL Server 2012) mereka FIRST_VALUE()dan LAST_VALUE().

Jadi, jika Anda 2012 atau lebih baik (atau Azure SQL Database), berikut adalah satu cara untuk mendapatkan jawaban Anda:

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

Satu lagi cara (yang bekerja di versi yang lebih lama juga):

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

1

Inilah salah satu cara Anda bisa melakukan itu:

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

Idenya di sini adalah untuk mendefinisikan baris "pertama" dan "terakhir". Setelah Anda menentukannya, Anda cukup melakukan pengurangan.


-2

Mengapa tidak menggunakan Fungsi MAX dan Min (Opsional jika Anda memiliki Kriteria gunakan Di Mana)

Misalnya. Pilih (Max (NumFieldName) - Min (NumFieldName)) AS Output DARI TableName


1
Tidak ada jaminan bahwa Valuekolom selalu meningkat. Namun, kolom identitas adalah.
RDFozz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.