FIRST () ve LAST () SQL Server 2012 sürümleri nelerdir?


10

Sütunlu bir masam var value. Burada gösterildiği gibi son satırı eksi ilk satırı hesaplamak istiyorum:

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

Elde etmek istiyorum 200 - 10 = 190

Ancak, SQL Server 2012'de aşağıdaki komutu kullanmaya çalıştım LASTve FIRSTçalışmıyor.

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

SQL Server'da bu komutun sözdizimi nedir?


@ mohammad2050 - sorun "ilk" ve "son" satırları nasıl tanımladığınızdır. Siparişin ne olması gerektiğini tanımlayan başka bir sütun var mı? Örneğin , "ilk" ve "son" satırların ne olduğunu tanımlayan bir IDENTITYsütun veya belki de bir DATETIMEsütun var mı?
Max Vernon

1
evet, 1 ve son IDENTITY sütun ve tanklar benim id düzenlemek sütun için kimlik sütun var
mohammad2050

Yanıtlar:


21

Yakındınız FIRSTve LASTAccess'tensiniz; SQL Server'da (SQL Server 2012 ile başlayarak) bunlar FIRST_VALUE()ve LAST_VALUE().

Yani, 2012 veya daha iyiyseniz (veya Azure SQL Veritabanı), cevabınızı almanın bir yolu:

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

Bir yol daha (eski sürümlerde de çalışır):

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

1

İşte bunu yapmanın bir yolu:

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

Buradaki fikir "ilk" ve "son" satırları tanımlamaktır. Bunları tanımladıktan sonra, çıkarma işlemini yapabilirsiniz.


-2

Neden MAX ve Min İşlevini kullanmıyorsunuz (Kriterler Nerede kullanılırsa isteğe bağlı)

Örneğin. (Max (NumFieldName) - Min (NumFieldName)) öğesini seçin.


1
ValueSütunun her zaman arttığının garantisi yoktur . Ancak kimlik sütunu.
RDFozz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.