FIRST () এবং শেষ () এর এসকিউএল সার্ভার 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;

এসকিউএল সার্ভারে এই কমান্ডের সিনট্যাক্সটি কী?


@ মোহাম্মদ2050 - সমস্যাটি কীভাবে আপনি "প্রথম" এবং "শেষ" সারিগুলি সংজ্ঞায়িত করেন। অর্ডারটি কী হওয়া উচিত তা সংজ্ঞায়িত করে এমন আরও কিছু কলাম রয়েছে? উদাহরণস্বরূপ, কোনও IDENTITYকলাম বা সম্ভবত একটি DATETIMEকলাম রয়েছে যা "প্রথম" এবং "শেষ" সারিগুলি কী তা নির্ধারণ করে?
ম্যাক্স ভার্নন

1
হ্যাঁ, আমি আইডি কলাম যে গত হয় 1 এবং পরিচয় কলাম এবং ট্যাংক ম্যাক্স সম্পাদনার জন্য আমার সমস্যা আছে
mohammad2050

উত্তর:


21

আপনি কাছাকাছি ছিলেন - FIRSTএবং LASTঅ্যাক্সেস থেকে এসেছেন; SQL সার্ভার তারা হয় (SQL সার্ভার 2012 দিয়ে শুরু) FIRST_VALUE()এবং LAST_VALUE()

সুতরাং, আপনি যদি 2012 বা আরও ভাল (বা অ্যাজুরি এসকিউএল ডেটাবেস) হন তবে আপনার উত্তর পাওয়ার জন্য এখানে একটি উপায় রয়েছে:

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 এবং ন্যূনতম ফাংশন ব্যবহার করবেন না (যদি আপনার মানদণ্ডের ব্যবহার থাকে তবে alচ্ছিক)

যেমন। টেবিলের নাম থেকে আউটপুট হিসাবে (সর্বোচ্চ (নুমফিল্ডনাম) - ন্যূনতম (নুমফিল্ডনাম) নির্বাচন করুন


1
Valueকলামটি সর্বদা বাড়ছে এমন কোনও গ্যারান্টি নেই । পরিচয় কলামটি অবশ্য।
আরডিফোজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.