Was sind die SQL Server 2012-Versionen von FIRST () und LAST ()?

10

Ich habe eine Tabelle mit einer valueSpalte. Ich möchte die letzte Zeile abzüglich der ersten Zeile berechnen, wie hier gezeigt:

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

Ich möchte erhalten 200 - 10 = 190

Ich habe jedoch versucht, den folgenden Befehl in SQL Server 2012 zu verwenden, LASTund es FIRSTfunktioniert nicht.

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

Wie lautet die Syntax für diesen Befehl in SQL Server?

mohammad2050
quelle
@ mohammad2050 - das Problem ist, wie Sie die "ersten" und "letzten" Zeilen definieren. Gibt es eine andere Spalte, die definiert, wie die Reihenfolge lauten soll? Gibt es zum Beispiel eine IDENTITYSpalte oder vielleicht eine DATETIMESpalte, die definiert, was die "ersten" und "letzten" Zeilen sind?
Max Vernon
1
Ja, ich habe ID-Spalte, die 1 bis zuletzt ist und IDENTITY-Spalte und Tanks Max für die Bearbeitung meines Problems ist
mohammad2050

Antworten:

20

Sie waren nah dran - FIRSTund LASTsind von Access; In SQL Server (beginnend mit SQL Server 2012) sind dies FIRST_VALUE()und LAST_VALUE().

Wenn Sie 2012 oder besser sind (oder eine Azure SQL-Datenbank), haben Sie folgende Möglichkeit, Ihre Antwort zu erhalten:

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;
Aaron Bertrand
quelle
9

Ein weiterer Weg (der auch in älteren Versionen funktioniert):

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

Hier ist eine Möglichkeit, wie Sie das tun können:

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

Die Idee hier ist, die "ersten" und "letzten" Zeilen zu definieren. Sobald Sie sie definiert haben, können Sie einfach die Subtraktion durchführen.

Max Vernon
quelle
-2

Warum nicht die MAX- und Min-Funktion verwenden (Optional, wenn Sie Kriterien haben, verwenden Sie Wo)

Z.B. Wählen Sie (Max (NumFieldName) - Min (NumFieldName)) AS Output FROM TableName

Rupam
quelle
1
Es gibt keine Garantie dafür, dass die ValueSpalte immer größer wird. Die Identitätsspalte ist jedoch.
RDFozz