FIRST () 및 LAST ()의 SQL Server 2012 버전은 무엇입니까?


10

value열 이있는 테이블이 있습니다. 여기에 표시된 것처럼 마지막 행에서 첫 번째 행을 뺀 것을 계산하고 싶습니다.

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

나는 얻고 싶다 200 - 10 = 190

나는 그러나, SQL 서버 2012의 명령 아래를 사용하려고했습니다 LASTFIRST작업을하지 않습니다.

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

SQL Server에서이 명령의 구문은 무엇입니까?


@ mohammad2050-문제는 "첫 번째"행과 "마지막"행을 어떻게 정의 하는가입니다. 순서를 정의하는 다른 열이 있습니까? 예를 들어, "첫 번째"행과 "마지막"행을 정의 하는 IDENTITY열 또는 DATETIME열이 있습니까?
Max Vernon

1
yes, 나는 1에서 마지막으로 ID 열을 가지고 있으며 IDENTITY 열과 탱크는 내 문제를 편집하기 위해 최대입니다
mohammad2050

답변:


21

당신은 가까웠다 - FIRSTLASTAccess에서이다; SQL 서버에 그들이 (SQL 서버 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컬럼이 항상 증가 한다는 보장은 없습니다 . 그러나 ID 열은입니다.
RDFozz 2018
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.