SQL Server 2012的FIRST()和LAST()版本是什么?


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-问题是如何定义“第一”和“最后”行。是否还有其他一些列定义了订单的顺序?例如,是否有一IDENTITY列或一DATETIME列定义“第一”和“最后”行是什么?
Max Vernon 2015年

1
是的,我的id列是最后一个,而IDENTITY列和tanks最大可以编辑我的问题
mohammad2050 2015年

Answers:


20

你接近- FIRST并且LAST是从Access; 在SQL Server(从SQL Server 2012开始)中,它们分别是FIRST_VALUE()LAST_VALUE()

因此,如果您是2012年或以后(或Azure SQL数据库)或更高,以下是一种获得答案的方法:

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) ;

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函数(如果您有使用Criteria的条件,则为可选)

例如。从TableName中选择(Max(NumFieldName)-Min(NumFieldName))AS输出


1
不能保证该Value列总是在增加。但是,标识列是。
RDFozz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.