Quali sono le versioni SQL Server 2012 di FIRST () e LAST ()?


10

Ho una tabella con una valuecolonna. Voglio calcolare l'ultima riga meno la prima riga, come mostrato qui:

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

Voglio ottenere 200 - 10 = 190

Ho provato a utilizzare il comando seguente in SQL Server 2012, tuttavia LASTe FIRSTnon funziona.

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

Qual è la sintassi per questo comando in SQL Server?


@ mohammad2050 - il problema è come definire le righe "first" e "last". C'è qualche altra colonna che definisce quale dovrebbe essere l'ordine? Ad esempio, esiste una IDENTITYcolonna o forse una DATETIMEcolonna che definisce quali sono le "prime" e le "ultime" righe?
Max Vernon,

1
Sì, ho una colonna ID che è 1 per ultimo ed è la colonna IDENTITÀ e i carri armati Max per la modifica del mio problema
mohammad2050,

Risposte:


20

Eri vicino - FIRSTe LASTsei di Access; in SQL Server (a partire da SQL Server 2012) sono FIRST_VALUE()e LAST_VALUE().

Quindi, se sei 2012 o meglio (o Database SQL di Azure), ecco un modo per ottenere la tua risposta:

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

Un altro modo (che funziona anche nelle versioni precedenti):

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

1

Ecco un modo per farlo:

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

L'idea qui è di definire la "prima" e "ultima" riga. Dopo averli definiti, puoi semplicemente fare la sottrazione.


-2

Perché non usare la funzione MAX e Min (Opzionale se hai Criteri usa Where)

Per esempio. Selezionare (Max (NumFieldName) - Min (NumFieldName)) AS Output FROM TableName


1
Non c'è garanzia che la Valuecolonna sia in costante aumento. La colonna identità è, tuttavia.
RDFozz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.