web-dev-qa-db-fra.com

Quelles sont les versions SQL Server 2012 de FIRST () et LAST ()?

J'ai une table avec une colonne value. Je veux calculer la dernière ligne moins la première ligne, comme indiqué ici:

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

Je veux obtenir 200 - 10 = 190

J'ai essayé d'utiliser la commande ci-dessous dans SQL Server 2012, mais LAST et FIRST ne fonctionnent pas.

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

Quelle est la syntaxe de cette commande dans SQL Server?

10
mohammad2050

Vous étiez proche - FIRST et LAST viennent d'Access; dans SQL Server (à partir de SQL Server 2012), ce sont FIRST_VALUE() et LAST_VALUE().

Donc, si vous êtes 2012 ou mieux (ou Azure SQL Database), voici une façon d'obtenir votre réponse:

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;
20
Aaron Bertrand

Une autre façon (qui fonctionne également dans les anciennes versions):

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

Voici une façon de procéder:

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'idée ici est de définir les "premières" et "dernières" lignes. Une fois que vous les avez définis, vous pouvez simplement faire la soustraction.

1
Max Vernon