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でのこのコマンドの構文は何ですか?
あなたは近かった-FIRST
とLAST
はAccessからのものです。 SQL Server(SQL Server 2012以降)では、これらはFIRST_VALUE()
およびLAST_VALUE()
です。
したがって、あなたが2012以上(またはAzure SQLデータベース)である場合、答えを得る1つの方法は次のとおりです。
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;
もう1つの方法(古いバージョンでも機能します):
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
ここでの考え方は、「最初」と「最後」の行を定義することです。それらを定義したら、単純に減算を行うことができます。