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 - ปัญหาคือคุณจะกำหนดแถว "แรก" และ "สุดท้าย" ได้อย่างไร มีคอลัมน์อื่นที่กำหนดว่าคำสั่งควรเป็นอย่างไร ตัวอย่างเช่นมีIDENTITYคอลัมน์หรืออาจเป็นDATETIMEคอลัมน์ที่กำหนดว่าแถว "แรก" และ "สุดท้าย" คืออะไร?
Max Vernon

1
ใช่ฉันมีคอลัมน์ id ที่ 1 ถึงล่าสุดและเป็นคอลัมน์ประจำตัวและรถถัง Max สำหรับการแก้ไขปัญหาของฉัน
mohammad2050

คำตอบ:


21

คุณสนิท - FIRSTและLASTมาจากการเข้าถึง ใน SQL Server (เริ่มต้นด้วย SQL Server 2012) พวกเขาเป็นและFIRST_VALUE()LAST_VALUE()

ดังนั้นหากคุณเป็นปี 2555 หรือดีกว่า (หรือฐานข้อมูล 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 (ตัวเลือกหากคุณมีเกณฑ์การใช้อยู่ที่ไหน)

เช่น. เลือก (สูงสุด (NumFieldName) - ต่ำสุด (NumFieldName)) เป็นเอาต์พุตจาก TableName


1
ไม่รับประกันว่าValueคอลัมน์จะเพิ่มขึ้นเสมอ อย่างไรก็ตามคอลัมน์ข้อมูลประจำตัวคือ
RDFozz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.