FIRST () और LAST () के SQL सर्वर 2012 संस्करण क्या हैं?


10

मेरे पास एक valueकॉलम वाली एक टेबल है । मैं पिछली पंक्ति की पहली पंक्ति की गणना करना चाहता हूं, जैसा कि यहां दिखाया गया है:

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

मैं प्राप्त करना चाहता हूं 200 - 10 = 190

मैंने SQL सर्वर 2012 में निम्न कमांड का उपयोग करने की कोशिश की है, हालांकि LASTऔर FIRSTकाम नहीं करता है।

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

SQL सर्वर में इस कमांड का सिंटैक्स क्या है?


@ mohammad2050 - समस्या यह है कि आप "पहली" और "अंतिम" पंक्तियों को कैसे परिभाषित करते हैं। क्या कोई और स्तंभ है जो परिभाषित करता है कि आदेश क्या होना चाहिए? उदाहरण के लिए, क्या कोई IDENTITYस्तंभ या शायद एक DATETIMEस्तंभ है जो परिभाषित करता है कि "पहले" और "अंतिम" पंक्तियाँ क्या हैं?
मैक्स वेरनॉन

1
हां, मेरे पास आईडी कॉलम है जो 1 से आखिरी में है और मेरी समस्या को संपादित करने के लिए पहचान की कॉलम और टैंक मैक्स है
mo132050

जवाबों:


21

आप करीब थे - FIRSTऔर LASTएक्सेस से हैं; 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 और न्यूनतम फ़ंक्शन का उपयोग क्यों न करें (यदि आपके पास मानदंड का उपयोग करें तो वैकल्पिक)

उदाहरण के लिए। Select (Max (NumFieldName) - Min (NumFieldName)) जैसा कि TableName से आउटपुट होता है


1
कोई गारंटी नहीं है कि Valueकॉलम हमेशा बढ़ रहा है। पहचान कॉलम हालांकि है।
RDFozz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.