এসকিউএল-তে সর্বনিম্ন দুটি মান প্রাপ্ত


179

আমার দুটি ভেরিয়েবল রয়েছে, একটিকে বলা হয় PaidThisMonth, এবং অন্যটি বলা হয় OwedPast। এগুলি উভয়ই এসকিউএল-এর কয়েকটি সাবকিউয়ের ফলাফল। আমি কীভাবে দুটির চেয়ে ছোটটি নির্বাচন করতে পারি এবং এটি শিরোনামের মান হিসাবে ফিরিয়ে দিতে পারি PaidForPast?

MINফাংশন কলাম, না ভেরিয়েবল কাজ করে।


1
আপনি যদি পোস্টগ্রিস বা মাইএসকিউএল এ থাকেন তবে @ গিল_মার্গোলিনের উত্তরটি এড়িয়ে যান।
নওম্যানন

উত্তর:


127

ব্যবহারের ক্ষেত্রে:

   Select Case When @PaidThisMonth < @OwedPast 
               Then @PaidThisMonth Else @OwedPast End PaidForPast

ইনলাইন টেবিল হিসাবে ইউডিএফ মূল্যবান

CREATE FUNCTION Minimum
(@Param1 Integer, @Param2 Integer)
Returns Table As
Return(Select Case When @Param1 < @Param2 
                   Then @Param1 Else @Param2 End MinValue)

ব্যবহার:

Select MinValue as PaidforPast 
From dbo.Minimum(@PaidThisMonth, @OwedPast)

অ্যাডেন্ডেন্ডাম: কেবল দুটি সম্ভাব্য মানকে সম্বোধন করার জন্য এটি সম্ভবত সেরা, যদি সেখানে দুটিরও বেশি থাকে তবে মানগুলির ধারাটি ব্যবহার করে ক্রেগের উত্তরটি বিবেচনা করুন ।


আরও ভাল বোধগম্য বাক্য গঠন: প্রত্যাবর্তন করুন (মিনিটভ্যালু = ক্ষেত্রে নির্বাচন করুন যখন @@ প্যারাম 1 <@@ প্যারাম 2 তারপরে @@ প্যারাম 1 অন্য @@ প্যারাম 2 শেষ)। ঠিক আছে এটি স্বাভাবিক করা যাবে না, আমি জানি না। তবে এটি অনেক বেশি বোধগম্য এবং এটি স্বাভাবিক করা উচিত।
সফটলিয়ন

1
নীচে @ ক্রেগের উত্তর পছন্দ করার আরেকটি কারণ হ'ল নাল পরিচালনা। মান তুলনা করা হচ্ছে nullable হয়, এবং যদি এক মূল্যবোধের তুলনা করা হচ্ছে, যখন পরীক্ষা ক্রম উপর নির্ভর করে (যতক্ষণ না আপনি ISNULL ব্যবহার যোগ করুন) নাল, সুইচ-কেস দেখানো শক্তি প্রত্যাবর্তন নাল বা মান। ক্রেগের দৃষ্টিভঙ্গি সর্বদা নূন্যতম মান নির্বাচন করা পছন্দ করবে যা আমার কাছে আরও সঠিক বলে মনে হয়, কমপক্ষে আমার বর্তমান ব্যবহারের ক্ষেত্রে কম খরচের তারিখের তুলনায়।
নিজ

146

এসকিউএল সার্ভার 2012 এবং 2014 আইআইএফ (বিপরীতে, সত্য, মিথ্যা) ফাংশন সমর্থন করে। এইভাবে ন্যূনতম নির্বাচনের জন্য আপনি এটি পছন্দ মতো ব্যবহার করতে পারেন

SELECT IIF(first>second, second, first) the_minimal FROM table

আইআইএফ লেখার জন্য কেবল একটি সংক্ষিপ্তপদ হলেও CASE...WHEN...ELSEএটি লেখা সহজ।


8
IIFএর জন্য কেবল একটি সিনট্যাকটিক চিনি CASE...WHEN...ELSE
সালমান

55
সম্ভবত হ্যাঁ তবে লেখা সহজ।
Mert Gülsoy

1
@ MertGülsoy এবং পড়া সহজ, যা যথার্থতার পরে, সবার অগ্রাধিকার তালিকার শীর্ষে থাকা উচিত।
ড্যানিয়েল

118

সিএএসই, আইআইএফ, এবং ইউডিএফ ব্যবহারের সমাধানগুলি পর্যাপ্ত, তবে 2 টিরও বেশি তুলনামূলক মান ব্যবহার করে সাধারণ ক্ষেত্রে সমস্যাটি প্রসারিত করার সময় অযৌক্তিক। এসকিউএল সার্ভার ২০০৮-এর সাধারণ সমাধানটি ভ্যালুসের ধারাটির একটি অদ্ভুত অ্যাপ্লিকেশন ব্যবহার করে:

SELECT
PaidForPast=(SELECT MIN(x) FROM (VALUES (PaidThisMonth),(OwedPast)) AS value(x))

এই ওয়েবসাইটের কারণে Credit ণ সার্ভার-টি-sql.aspx


12
এটি সেরা উত্তর
ফাইন্ডআউটস্লাইম

যদি আপনি MIN(x*(case x when 0 then null else 1 end))
নূন্যতম নূন্যতম

চার বছর আগে মার্টিনসি একই উত্তর না দিয়ে, এবং আসলে এটি দুটিরও বেশি মান সহ দেখিয়েছিল ...
অ্যাসপেক্স

4
অস্পেক্স, মার্টিনসির উত্তর সম্পর্কিত নয়। এই উত্তরটি ইউনিয়নগুলি ব্যবহার করে না।
ক্রেগ

29

আমার সবেমাত্র একটি পরিস্থিতি ছিল যেখানে আমাকে একটি আপডেটের মধ্যে সর্বোচ্চ 4 টি জটিল নির্বাচন খুঁজে পেতে হয়েছিল। এই পদ্ধতির সাহায্যে আপনার পছন্দ মতো অনেকগুলি থাকতে পারে!

আপনি অ্যাডিশনাল বাছাইয়ের সাথে সংখ্যাগুলিও প্রতিস্থাপন করতে পারেন

select max(x)
 from (
 select 1 as 'x' union
 select 4 as 'x' union
 select 3 as 'x' union
 select 2 as 'x' 
 ) a

আরও জটিল ব্যবহার

 @answer = select Max(x)
           from (
                select @NumberA as 'x' union
                select @NumberB as 'x' union
                select @NumberC as 'x' union
                select (
                       Select Max(score) from TopScores
                       ) as 'x' 
     ) a

আমি নিশ্চিত যে কোনও ইউডিএফের আরও ভাল পারফরম্যান্স রয়েছে।


এটি বেসিক এসকিউএল যেহেতু আমি সেটিকে সবচেয়ে পছন্দ করি। তদুপরি, ইউডিএফগুলি দ্রুত প্রয়োজন হয় না। বেশিরভাগ কলাম স্টোরের জন্য, প্রতিটি অ্যাট্রিবিউট (আমি ধরে নিয়েছি আপনিও বৈশিষ্ট্যগুলিতে ফিল্টার করতে চলেছেন) সমান্তরালে গণনা করা যেতে পারে এবং কেবল যোগ্যতার সেটটি মিলিত হয়। ইউনিয়নগুলি প্রতি সেয়ে ধীর হয় না।
বাউনার 6

সহজ এবং দুর্দান্ত
ashleedawg

21

মাইএসকিউএল বা পোস্টগ্রি 9.3+, একটি ভাল উপায় ব্যবহার করা LEASTএবং GREATESTফাংশন।

SELECT GREATEST(A.date0, B.date0) AS date0, 
       LEAST(A.date1, B.date1, B.date2) AS date1
FROM A, B
WHERE B.x = A.x

সঙ্গে:

  • GREATEST(value [, ...]): ফেরত পাঠায় বৃহত্তম মান থেকে (সর্বোচ্চ-মূল্যবান) যুক্তি প্রদান করা
  • LEAST(value [, ...])ফেরত পাঠায় ক্ষুদ্রতম মান থেকে (ন্যূনতম-মূল্যবান) যুক্তি প্রদান করা

ডকুমেন্টেশন লিঙ্ক:


এটি পোস্টগ্রেএসকিউএল-তেও কাজ করে (এবং এটি আমি ঠিক যা খুঁজছিলাম :) দেখুন: postgresql.org/docs/9.5/static/funitions-conditional.html
অ্যালবার্ট ভাকা সিন্টোরা

1
এটি এখন পর্যন্ত সেরা উত্তর।
রবার্তো রদ্রিগেজ

2
@ রবার্তো রডরিগুয়েজ যদি মাইএসকিউএল বা পোস্টগ্র্রেএসকিউএলকে প্রশ্নের অংশ হিসাবে ট্যাগ করে থাকে তবে এটি সবচেয়ে ভাল হবে। প্রশ্নটি বিশেষত tsql সম্পর্কিত ছিল সুতরাং এই উত্তরটি মোটেই সহায়তা করে না।
Jmaurier


13

আপনি সর্বোচ্চ (ক্ষেত্র, 0) গণনা করতে চান তবে এখানে একটি কৌশল a

SELECT (ABS(field) + field)/2 FROM Table

fieldnegative ণাত্মক হলে 0 প্রদান করে , অন্যথায়, ফিরে আসুন field


3
সুতরাং, সর্বনিম্ন (@ একটি, @ বি) গণনা করতে, আপনি ব্যবহার করতে পারেন:SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
স্কটিটিক

1
এবং ওভারফ্লো টাইপ সম্পর্কে ভুলবেন না;)
pkuderov

এটি কি ভাসমান-পয়েন্ট যথার্থ অবস্থান থেকে সংরক্ষণ করা যায়? এটা কি নিশ্চিত যে ফলাফলটি কখনও শূন্যের কাছাকাছি কিছু না হলেও নেতিবাচক হবে না?
জুরফ

6

একটি CASE বিবৃতি ব্যবহার করুন।

এই পৃষ্ঠার বি উদাহরণটি আপনি যা করার চেষ্টা করছেন তার খুব কাছাকাছি হওয়া উচিত:
http://msdn.microsoft.com/en-us/library/ms181765.aspx

পৃষ্ঠাটি থেকে কোডটি এখানে:

USE AdventureWorks;
GO
SELECT   ProductNumber, Name, 'Price Range' = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber ;
GO

2

মানগুলির সীমা sertোকাতে একটি টেম্প টেবিল ব্যবহার করুন, তারপরে কোনও সঞ্চিত প্রক্রিয়া বা ইউডিএফের মধ্য থেকে টেম্প টেবিলের সর্বনিম্ন / সর্বোচ্চ নির্বাচন করুন। এটি একটি মৌলিক নির্মাণ, সুতরাং প্রয়োজনীয় হিসাবে সংশোধন নির্দ্বিধায়।

উদাহরণ স্বরূপ:

CREATE PROCEDURE GetMinSpeed() AS
BEGIN

    CREATE TABLE #speed (Driver NVARCHAR(10), SPEED INT);
    '
    ' Insert any number of data you need to sort and pull from
    '
    INSERT INTO #speed (N'Petty', 165)
    INSERT INTO #speed (N'Earnhardt', 172)
    INSERT INTO #speed (N'Patrick', 174)

    SELECT MIN(SPEED) FROM #speed

    DROP TABLE #speed

END

2

এটি 5 টি তারিখ পর্যন্ত কাজ করে এবং নালগুলি পরিচালনা করে। এটি কোনও ইনলাইন ফাংশন হিসাবে কাজ করতে পারা যায় নি।

CREATE FUNCTION dbo.MinDate(@Date1 datetime = Null,
                            @Date2 datetime = Null,
                            @Date3 datetime = Null,
                            @Date4 datetime = Null,
                            @Date5 datetime = Null)
RETURNS Datetime AS
BEGIN
--USAGE select dbo.MinDate('20120405',null,null,'20110305',null)
DECLARE @Output datetime;

WITH Datelist_CTE(DT)
AS (
        SELECT @Date1 AS DT WHERE @Date1 is not NULL UNION
        SELECT @Date2 AS DT WHERE @Date2 is not NULL UNION
        SELECT @Date3 AS DT WHERE @Date3 is not NULL UNION
        SELECT @Date4 AS DT WHERE @Date4 is not NULL UNION
        SELECT @Date5 AS DT WHERE @Date5 is not NULL
   )
Select @Output=Min(DT) FROM Datelist_CTE

RETURN @Output
END

ঠিক বুঝতে পেরেছেন যে আপনার WHERE Clauses এর দরকার নেই কারণ MIN যেভাবে নলগুলি সরিয়ে ফেলবে।
লরেন্স

2

গণিত এবং স্কটিটিকের উজ্জ্বল যুক্তি / কোডের উপর ভিত্তি করে, আমি জমা দিচ্ছি:

DECLARE @a INT, @b INT, @c INT = 0

WHILE @c < 100
    BEGIN
        SET @c += 1
        SET @a = ROUND(RAND()*100,0)-50
        SET @b = ROUND(RAND()*100,0)-50
        SELECT @a AS a, @b AS b,
            @a - ( ABS(@a-@b) + (@a-@b) ) / 2 AS MINab,
            @a + ( ABS(@b-@a) + (@b-@a) ) / 2 AS MAXab,
            CASE WHEN (@a <= @b AND @a = @a - ( ABS(@a-@b) + (@a-@b) ) / 2)
            OR (@a >= @b AND @a = @a + ( ABS(@b-@a) + (@b-@a) ) / 2)
            THEN 'Success' ELSE 'Failure' END AS Status
    END

যদিও স্কটিটিকের এমআইএন ফাংশন থেকে ম্যাক্স ফাংশনে যাওয়ার লাফটি আমার কাছে স্পষ্ট হওয়া উচিত ছিল, এটি ছিল না, তাই আমি এর সমাধান করেছি এবং এটি এখানে অন্তর্ভুক্ত করেছি: নির্বাচন করুন @ এ + (এবিএস (@ বি- @ এ) + ( @ বি- @ এ)) / ২ এলোমেলোভাবে উত্পন্ন সংখ্যাগুলি প্রমাণ হিসাবে না হলেও কমপক্ষে সংশয়ীদের বোঝাতে হবে যে উভয় সূত্রই সঠিক।

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