¿Cuáles son las versiones de SQL Server 2012 de FIRST () y LAST ()?

10

Tengo una mesa con una valuecolumna. Quiero calcular la última fila menos la primera fila, como se muestra aquí:

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

Quiero obtener 200 - 10 = 190

Sin embargo, he tratado de usar el siguiente comando en SQL Server 2012 LASTy FIRSTno funciona.

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

¿Cuál es la sintaxis para este comando en SQL Server?

mohammad2050
fuente
@ mohammad2050: el problema es cómo define las filas "primera" y "última". ¿Hay alguna otra columna que defina cuál debería ser el orden? Por ejemplo, ¿hay una IDENTITYcolumna o quizás una DATETIMEcolumna que defina cuáles son las filas "primera" y "última"?
Max Vernon
1
sí, tengo una columna de identificación que es 1 para durar y es la columna de IDENTIDAD y los tanques Max para editar mi problema
mohammad2050

Respuestas:

20

Estabas cerca, FIRSTy LASTeres de Access; en SQL Server (a partir de SQL Server 2012) son FIRST_VALUE()y LAST_VALUE().

Entonces, si tiene 2012 o mejor (o Azure SQL Database), esta es una forma de obtener su respuesta:

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
fuente
9

Una forma más (que también funciona en versiones anteriores):

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

Aquí hay una manera de hacer eso:

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

La idea aquí es definir las filas "primera" y "última". Una vez que los haya definido, simplemente puede hacer la resta.

Max Vernon
fuente
-2

¿Por qué no usar las funciones MAX y Min?

P.ej. Seleccione (Máx. (NumFieldName) - Mín. (NumFieldName)) COMO salida DE TableName

Rupam
fuente
1
No hay garantía de que la Valuecolumna siempre esté aumentando. La columna de identidad es, sin embargo.
RDFozz