Каковы версии FIRST () и LAST () для SQL Server 2012?

10

У меня есть таблица с valueколонкой. Я хочу вычислить последнюю строку минус первую строку, как показано здесь:

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

Я хочу получить 200 - 10 = 190

Я попытался использовать приведенную ниже команду в SQL Server 2012, однако LASTи FIRSTне работает.

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

Каков синтаксис этой команды в SQL Server?

mohammad2050
источник
@ mohammad2050 - проблема в том, как определить «первый» и «последний» ряды. Есть ли какой-то другой столбец, который определяет, какой порядок должен быть? Например, есть ли IDENTITYстолбец или, возможно, DATETIMEстолбец, который определяет, что такое «первая» и «последняя» строки?
Макс Вернон
1
да, у меня есть столбец идентификатора, от 1 до последнего, и столбец IDENTITY и резервуары Max для редактирования моей проблемы
mohammad2050

Ответы:

20

Вы были рядом - FIRSTи LASTиз Access; в SQL Server (начиная с SQL Server 2012) они есть FIRST_VALUE()и LAST_VALUE().

Итак, если вы 2012 или выше (или База данных SQL Azure), вот один из способов получить ваш ответ:

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

Еще один способ (который работает и в более старых версиях):

SELECT 
    result = (SELECT TOP (1) value FROM counter ORDER BY id DESC)
             - (SELECT TOP (1) value FROM counter ORDER BY id ASC) ;
ypercubeᵀᴹ
источник
1

Вот один из способов сделать это:

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

Идея здесь состоит в том, чтобы определить «первую» и «последнюю» строки. Как только вы их определили, вы можете просто сделать вычитание.

Макс Вернон
источник
-2

Почему бы не использовать функции MAX и Min (Необязательно, если у вас есть Критерии, используйте Где)

Например. Выберите (Макс. (NumFieldName) - Мин. (NumFieldName)) AS Выходные данные из TableName

Rupam
источник
1
Там нет никакой гарантии, что Valueстолбец всегда увеличивается. Столбец идентичности, однако.
RDFozz