এসকিউএল সার্ভারে একটি ম্যাক্স ফাংশন রয়েছে যা .NET এ ম্যাথ.ম্যাক্সের মতো দুটি মান নেয়?


488

আমি এই জাতীয় একটি কোয়েরি লিখতে চাই:

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

কিন্তু এটি ঠিক কিভাবে MAXফাংশন কাজ করে না? এটি একটি সামগ্রিক ফাংশন তাই এটি একটি একক প্যারামিটার আশা করে এবং তারপরে সমস্ত সারিটির MAX প্রদান করে।

কেউ কি আমার উপায় এটি জানেন?


13
এটি বেশিরভাগ অন্যান্য ডাটাবেসে GREATESTফাংশন হিসাবে প্রয়োগ করা হয় ; এসকিউএলাইট MAXসামগ্রিকভাবে একাধিক কলামগুলিকে অনুমতি দিয়ে সহায়তা এমুলেট করে।
ওএমজি পনিস


নীচে সর্বাধিক (ক, খ) এর সমাধানের সন্ধান করার সময় আপনি "এ" এবং / বা "বি" এর জন্য সিনট্যাক্স বা গণনা চান কিনা তা এই প্রশ্নটি মনে রাখবেন। উদাহরণস্বরূপ, "বি" যদি প্রচুর সিনট্যাক্সের সাথে জড়িত একটি জটিল গণনা থেকে উদ্ভূত হয় তবে আপনি একটি সমাধান পছন্দ করতে পারেন যেখানে "বি" কেবল একবার প্রদর্শিত হবে। উদাহরণস্বরূপ "IIF (a> b, a, b)" এর অর্থ "বি" পুনরাবৃত্তি করা - যা সিন্টেক্সিকভাবে কুৎসিত হতে পারে, তবে নীচের সমাধানটির অর্থ "বি" (এবং "ক") কেবল একবার উপস্থিত হবে: নির্বাচন করুন ম্যাক্স (মান) টি 1
অ্যান্ড্রু জেনস

উত্তর:


158

User-Defined Functionআপনার উদাহরণের মতো সিনট্যাক্স রাখতে চাইলে আপনাকে একটি তৈরি করতে হবে তবে আপনি যা করতে চান তা করতে পারেন, ইনলাইন, মোটামুটি সহজেই একটি দিয়েCASE বিবৃতি অন্যদের বলেছি।

UDFভালো কিছু হতে পারে:

create function dbo.InlineMax(@val1 int, @val2 int)
returns int
as
begin
  if @val1 > @val2
    return @val1
  return isnull(@val2,@val1)
end

... এবং আপনি এটিকে এভাবে ডাকবেন ...

SELECT o.OrderId, dbo.InlineMax(o.NegotiatedPrice, o.SuggestedPrice) 
FROM Order o

24
আমি আপনাকে সমাধানটি সমর্থন করব, কেবলমাত্র আমি যুক্ত করব নুল মানগুলির সমর্থন। যদি আপনি কেবল চূড়ান্ত লাইনটি পরিবর্তন করেন: "রিটার্ন @ ভ্যালু 2" হিসাবে এটি পড়তে হবে: "রিটার্ন ইসনুল (@ ভাল 2, @ ভাল 1)" তারপরে যদি মানগুলির মধ্যে একটিটি শূন্য হয় তবে ফাংশনটি নাল মানটি প্রদান করবে, অন্যথায় এটি কাজ করবে স্বাভাবিক
ক্রিস্টফ

1
অন্যান্য ডেটা ধরণের সম্পর্কে কী? যেমন, আমি একটি উচ্চতর তালিকাভুক্তি এবং একটি উচ্চতর তারিখের সময়কর্ম এবং একটি উচ্চতরচারআরগমেন্ট এবং একটি লিখতে চাই?
onedaywhen

9
এটি অবিশ্বাস্যরূপে ধীর হয়ে উঠবে, কারণ সমস্ত জিনিস স্কলারার ইউডিএফ। পরিবর্তে ইনলাইন ইউডিএফ ব্যবহার করুন
এ কে

12
@ এক্সান আসলে যখন আমি এই প্রশ্নটি জিজ্ঞাসা করি তখন আমার মনে কী ঘটেছিল তা সম্পর্কে আমার কোনও ধারণা নেই। খুব বেশি না, স্পষ্টতই। যাইহোক উত্তরের জন্য ধন্যবাদ।
থমাস

13
@ থমাস বাধ্যতামূলক মেমের চিত্র (কোনওভাবেই আপনার উদ্দেশ্যে উদ্দেশ্যমূলক কোনও অপরাধ নয়!) Flickr.com/photos/16201371@N00/2375571206
xan

467

যদি আপনি এসকিউএল সার্ভার 2008 (বা তারপরের) ব্যবহার করে থাকেন তবে এটি আরও ভাল সমাধান:

SELECT o.OrderId,
       (SELECT MAX(Price)
        FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
FROM Order o

সমস্ত ক্রেডিট এবং ভোটগুলি "একাধিক কলামের এসকিউএল ম্যাক্স" সম্পর্কিত একটি প্রশ্নের সাথে সোভেনের উত্তরে যেতে হবে ?
আমি বলি এটি " সেরা উত্তর " কারণ:

  1. এটির জন্য আপনার ইউনিয়ন ইউনিয়ন, পিভটস, ইউএনপিআইভিটিস, ইউডিএফ এবং ক্রেজি দীর্ঘ-দীর্ঘ CASE স্ট্যাটাসগুলির সাথে জটিল করার দরকার নেই।
  2. এটি নালগুলি পরিচালনা করার সমস্যায় জর্জরিত নয়, এটি ঠিকভাবে পরিচালনা করে।
  3. "এমআইএন", "এভিজি", বা "এসইউএম" দিয়ে "ম্যাক্স" সরিয়ে আনা সহজ। আপনি বিভিন্ন বিভিন্ন কলামে সমষ্টি খুঁজে পেতে যে কোনও সমষ্টিগত ফাংশন ব্যবহার করতে পারেন।
  4. আমি যে নামগুলি ব্যবহার করেছি (যেমন "সমস্ত দাম" এবং "দাম") সীমাবদ্ধ নেই। পরবর্তী লোকের পক্ষে পড়া এবং বোঝার পক্ষে আরও সহজ করার জন্য আপনি নিজের নাম চয়ন করতে পারেন।
  5. আপনি এসকিউএল সার্ভার ২০০৮-এর উত্সযুক্ত_সামগ্রীগুলি ব্যবহার করে একাধিক সংখ্যক সন্ধান করতে পারেন:
    ম্যাক্স (ক), ম্যাক্স (খ) থেকে (ভ্যালু (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) মাই টেবিল (ক, খ)

27
প্রক্রিয়া / ফাংশন তৈরি করতে অ্যাক্সেসের প্রয়োজন হয় না এমন উত্তরগুলির জন্য কেবলমাত্র +1!
অ্যালেক্স

6
ঠিক ঠিক যে ধরণের উত্তর আমি খুঁজছিলাম। ফাংশনগুলি ব্যবহার করা ধীর এবং এটি তারিখগুলিতেও কাজ করবে, যা আমার প্রয়োজন।
জোহান স্ট্রিডম

3
+1 নিখুঁত কাজ করে, বিশেষ করে 2 টিরও বেশি কলামের তুলনা করার জন্য!
JanW

11
এটি CASE WHEN সমাধানের চেয়ে কম পারফরম্যান্ট যা কেবলমাত্র একটি স্কেলার গণনা করা দরকার।
টেকুমার

5
2 টি মানের MAX নির্ধারণের সময় সরল বাক্য গঠনটি কখনই পারফরম্যান্সের পক্ষে মূল্যহীন না হতে পারে, তবে এটি আরও মানগুলির সাথে আলাদা বিষয় হতে পারে। 4 টি মানের ম্যাক্স অর্জন করার পরেও ভ্যালুএস ধারাটি সহজ এবং স্পষ্ট থাকা অবস্থায় হাতের দ্বারা উত্পাদিত হয়ে গেলে CASE ক্লজগুলি দীর্ঘ, আনাড়ি এবং ত্রুটির প্রবণ হয়ে যায়।
টাইফ্লোসরাস

220

এক লাইনে করা যায়:

-- the following expression calculates ==> max(@val1, @val2)
SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2)) 

সম্পাদনা: আপনি যদি খুব বড় সংখ্যক সাথে কাজ করে থাকেন তবে একটি পূর্ণসংখ্যার ওভারফ্লো এড়াতে আপনাকে মান ভেরিয়েবলগুলি বিগিন্টে রূপান্তর করতে হবে।


18
+1 আমি বিশ্বাস করি আপনি সবচেয়ে সঠিক উপায়ে সরবরাহ করেছেন। "নির্বাচন করুন ((@ ভাল 1 + @ ভাল 2) + এবিএস (@ ভাল1- @ ভাল 2)) / 2 হিসাবে ম্যাক্সআরথআটডব্লিউও" এও মনে রাখবেন, "নির্বাচন করুন ((@ ভাল 1 + @ ভাল 2) - এবিএস (@ ভাল1- @ ভাল 2)) / 2 হিসাবে এমটিএফএফটি.টি.ও. "।
টম

6
এই পরিমাণটি একটি ওভারফ্লো ত্রুটি দেবে যদি যোগফলের চেয়ে বেশি পরিমাণ যোগ করা হয়: ইন্টিমেটেড ভ্যালু ইন্ট সেট @ ভাল 1 ইন্ট সেট @ ভাল 1 = 1500000000 সেট @ ভাল 2 = 1500000000 নির্বাচন করুন 0.5 * ((@ ভাল 1 + @ ভাল 2) + এবিএস (@ ভাল 1 - @ ভাল 2)) - => ওভারফ্লো ত্রুটি
আকাশম

89
এটি অত্যন্ত "নোংরা" "কৌশল"। প্রোগ্রামিংয়ের সময় আপনার কোডটি সুস্পষ্টভাবে লক্ষ্যটি প্রকাশ করা উচিত, তবে আপনার ক্ষেত্রে এটি মনে হচ্ছে অবলম্বন প্রতিযোগিতা থেকে নেওয়া কোডের মতো।
গ্রীনল্ডম্যান

24
এটি "নোংরা" হতে পারে তবে সাধারণ এসকিউএল উপভাষার সাথে এটি ডাটাবেসের একমাত্র বিকল্প হতে পারে।
splattne

12
আমি মার্সিয়াসের সাথে একমত নই। কোড অজানা নিজেরাই স্পষ্টভাবে লক্ষ্য প্রকাশ করতে হবে, যতক্ষণ না মন্তব্যগুলি এটিকে কার্যকর করার অনুমতি দেয়। আপনি যদি কোডে (বা অন্য কোথাও) কোনও জটিল গাণিতিক সমীকরণ করছেন তবে এটিকে স্ব বর্ণনামূলক করে তুলতে এর কখনও কখনও শক্ত ধরণের hard যতক্ষণ না এর ভাঙা সহজ, সহজ অংশগুলিতে বোঝা যায় ততক্ষণে এটি সঠিক প্রোগ্রামিং।
রব

127

আমি তাই মনে করি না. আমি অন্য দিন এটি চেয়েছিলাম। আমার কাছে সবচেয়ে কাছেরটি ছিল:

SELECT
  o.OrderId,
  CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
     ELSE o.SuggestedPrice
  END
FROM Order o

4
এটি আমার প্রিয় পদ্ধতি। আপনি কোনও ওভারফ্লো ঝুঁকিপূর্ণ করবেন না, এবং এটি স্প্ল্যাটেনের দ্রবণের চেয়ে কম ক্রিপ্টিক (যা দুর্দান্ত বিটিডাব্লু), এবং ইউডিএফ তৈরির ঝামেলা আমার নেই। কেস অনেক পরিস্থিতিতে খুব সুবিধাজনক।
ল্যান্স ফিশার

ওর্ডারআইডি নির্বাচন করুন, যখনই ও.ওগোটিয়েটেডপ্রাইস> ও.সগাস্টেডপ্রাইস বা ও.সোজেস্টডপ্রাইস কেবলমাত্র ও.নিগোটিয়েটেডপ্রাইস এল.এস.ই.এস.সুগস্টেডপ্রাইস অর্ডার থেকে শেষ করুন ও
মোঃঘেদারী

যখন "o.NegotiatedPrice" এর পরিবর্তে আপনার পরিবর্তে একটি শব্দ থাকে "" (ডেটেডিফ (দিন, রূপান্তর (তারিখের সময়, অ্যাড্রে_অন_সায়েন্স, 120), গেটডেট ()) - 5) * 0.3 "আপনাকে এই কোডটি পুনরাবৃত্তি করতে হবে। পদটিতে ভবিষ্যতের কোনও পরিবর্তন দুটিবার করতে হবে। একটি মিনিট (x, y, ...) টাইপ ফাংশনটি খুব সুন্দর হবে
ড্যানিয়েল

87

আইআইএফ ফাংশন কেন চেষ্টা করবেন না (এসকিউএল সার্ভার 2012 এবং তার পরে প্রয়োজন)

IIF(a>b, a, b)

এটাই.

(ইঙ্গিত: যে কোনওটি সম্পর্কে সতর্কতা অবলম্বন করুন null, যেহেতু a>bউভয়ই বাতিল bহবে তখনই ফলাফলটি মিথ্যা হবে So তাই এই ক্ষেত্রে ফলাফলও হবে)


7
মানগুলির মধ্যে একটি NULLহলে ফলাফল সর্বদা দ্বিতীয় হয়।
jahu

4
আইআইএফ () সিএসএসির বিবৃতিতে সিনট্যাকটিক চিনি। যদি CASE শর্তাধীন উভয়ের মান NULL হয় তবে ফলাফলটি দ্বিতীয়টি হবে (ELSE)।
xxyzzy

@xxyzzy এর কারণ হল NULL > 1234বিবৃতিটি মিথ্যা
জিন

8
সুতরাং IIF(a>b, a, COALESCE(b,a))যখন কেবলমাত্র একটি উপস্থিত থাকে তখন মানটি দিতে
এমপ্যাগ

32
DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE) 
               FROM (SELECT 1 AS VALUE UNION 
                     SELECT 2 AS VALUE) AS T1)

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

1
আমি ঘৃণা করি যে আমাকে এই সমাধানটি অবলম্বন করতে হবে, তবে এসকিউএল সার্ভারে এটি করা সবচেয়ে ভাল উপায় যে তারা গ্রেটস্ট বা ইন-লাইন ম্যাক্সের জন্য স্থানীয় সমর্থন যোগ না করে until এটি পোস্ট করার জন্য ধন্যবাদ - আপনাকে +1!
স্কেলরিয়ান

10

অন্যান্য উত্তরগুলি ভাল, তবে যদি আপনাকে ন্যূনাল মানগুলি নিয়ে চিন্তা করতে হয় তবে আপনি এই বৈকল্পিকটি পেতে পারেন:

SELECT o.OrderId, 
   CASE WHEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice) > ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
        THEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice)
        ELSE ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
   END
FROM Order o

1
শুধুমাত্র প্রয়োজনীয় ইসনুল ELSE এর পরে। প্রাথমিক ">" তুলনাটি মিথ্যা ফিরে আসবে এবং ইলএসইতে যাবে যদি মানগুলির কোনও একটি ইতিমধ্যে শূন্য থাকে।
ফিল বি

10

এসকিউএল সার্ভার ২০১২ বা তার চেয়েও বেশি, আপনি সর্বাধিক 2 টি মান পেতে IIFএবং ISNULL(বা COALESCE) এর সংমিশ্রণটি ব্যবহার করতে পারেন ।
এমনকি যখন তাদের 1 টি নুল হয়।

IIF(col1 >= col2, col1, ISNULL(col2, col1)) 

অথবা আপনি যদি চান যে এটি 0 ফেরত আসতে পারে যখন উভয়ই শুভ হয়

IIF(col1 >= col2, col1, COALESCE(col2, col1, 0)) 

স্নিপেট উদাহরণ:

-- use table variable for testing purposes
declare @Order table 
(
  OrderId int primary key identity(1,1),
  NegotiatedPrice decimal(10,2),
  SuggestedPrice decimal(10,2)
);

-- Sample data
insert into @Order (NegotiatedPrice, SuggestedPrice) values
(0, 1),
(2, 1),
(3, null),
(null, 4);

-- Query
SELECT 
     o.OrderId, o.NegotiatedPrice, o.SuggestedPrice, 
     IIF(o.NegotiatedPrice >= o.SuggestedPrice, o.NegotiatedPrice, ISNULL(o.SuggestedPrice, o.NegotiatedPrice)) AS MaxPrice
FROM @Order o

ফলাফল:

OrderId NegotiatedPrice SuggestedPrice  MaxPrice
1       0,00            1,00            1,00
2       2,00            1,00            2,00
3       3,00            NULL            3,00
4       NULL            4,00            4,00

তবে যদি একের একাধিক মান প্রয়োজন হয়?
তারপরে আমি VALUES এর সমষ্টিতে প্রয়োগের জন্য ক্রস করার পরামর্শ দিচ্ছি।
এটি একই সাথে অন্যান্য জিনিস গণনা করতে পারে যে সুবিধা আছে।

উদাহরণ:

SELECT t.*
, ca.[Total]
, ca.[Maximum]
, ca.[Minimum]
, ca.[Average]
FROM SomeTable t
CROSS APPLY (
   SELECT 
    SUM(v.col) AS [Total], 
    MIN(v.col) AS [Minimum], 
    MAX(v.col) AS [Maximum], 
    AVG(v.col) AS [Average]
   FROM (VALUES (t.Col1), (t.Col2), (t.Col3), (t.Col4)) v(col)
) ca

8

সাব-কোয়েরিগুলি আউটার ক্যোয়ারী থেকে কলামগুলি অ্যাক্সেস করতে পারে যাতে আপনি এই পদ্ধতিটি যেমন MAXকলাম জুড়ে সমষ্টি ব্যবহার করতে পারেন । (যদিও সেখানে আরও বেশি সংখ্যক কলাম জড়িত রয়েছে সম্ভবত সম্ভবত আরও দরকারী)

;WITH [Order] AS
(
SELECT 1 AS OrderId, 100 AS NegotiatedPrice, 110 AS SuggestedPrice UNION ALL
SELECT 2 AS OrderId, 1000 AS NegotiatedPrice, 50 AS SuggestedPrice
)
SELECT
       o.OrderId, 
       (SELECT MAX(price)FROM 
           (SELECT o.NegotiatedPrice AS price 
            UNION ALL SELECT o.SuggestedPrice) d) 
        AS MaxPrice 
FROM  [Order]  o

নিস! এটি খুব ভাল স্কেল আপ।
গ্রীনল্ডম্যান

এখনও 2005 সালের যারা তাদের জন্য ভালবাসা দেখানোর জন্য +1। আমি জানি না কীভাবে আমি এই উত্তরটিকে উপেক্ষা করেছি। প্রচ্ছদের অধীনে, আমি কল্পনা করি যে এটি 2 বছর পরে আমি কী পোস্ট করেছি ঠিক তেমন অভিনয় করে। পূর্ববর্তী ক্ষেত্রে, আমার এটি অনুধাবন করা উচিত ছিল এবং সেই সাথে নতুন ২০০৮ সিনট্যাক্সটি অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি আপডেট করা উচিত ছিল। দুঃখিত, আশা করি আমি এখন আমার সাথে আপনার পয়েন্টগুলি ভাগ করে নিতে পারতাম।
মাইকটাইভি

@ মাইকটিভি - ধন্যবাদ! হ্যাঁ কভারগুলির আওতায় পরিকল্পনাটি একই হবে। তবে VALUESবাক্য গঠনটি আরও সুন্দর।
মার্টিন স্মিথ

6

এসকিউএল সার্ভার 2012 চালু হয়েছে IIF:

SELECT 
    o.OrderId, 
    IIF( ISNULL( o.NegotiatedPrice, 0 ) > ISNULL( o.SuggestedPrice, 0 ),
         o.NegotiatedPrice, 
         o.SuggestedPrice 
    )
FROM 
    Order o

পরিচালনা NULLs মানের যখন ব্যবহার বাঞ্ছনীয় IIF, কারণ একটি NULLআপনার উভয় দিকে boolean_expressionইচ্ছা কারণ IIFফিরতে false_value(যেমন বিরোধিতা NULL)।


অন্য মানটি নেতিবাচক হলে আপনার সমাধান
নুলকে

5

আমি কেক্রামলে দ্বারা প্রদত্ত সমাধানটি দিয়ে যাব কেবল এনইউএলগুলি হ্যান্ডেল করার জন্য এটি সামান্য পরিবর্তন করুন

create function dbo.HigherArgumentOrNull(@val1 int, @val2 int)
returns int
as
begin
  if @val1 >= @val2
    return @val1
  if @val1 < @val2
    return @val2

 return NULL
end

মার্কের মন্তব্যের পরে EDIT সংশোধিত হয়েছে । যেমনটি তিনি 3 মূল্যের যুক্তি x> NULL বা x <NULL এ সঠিকভাবে নির্দেশ করেছেন সেটিকে সর্বদা NULL ফিরিয়ে দেওয়া উচিত। অন্য কথায় অজানা ফলাফল।


1
নাল গুরুত্বপূর্ণ। এবং এগুলি ধারাবাহিকভাবে পরিচালনা করা গুরুত্বপূর্ণ। ইস নাল> এক্স এর একমাত্র যথাযথ উত্তর হ'ল নুল।
মার্ক ব্র্যাকেট

আপনি ঠিকই বলেছেন, আমি আমার উত্তরটি প্রতিফলিত করে পরিবর্তন করব, এটি উল্লেখ করার জন্য ধন্যবাদ
ক্রিস্টফ

যদি আমরা কোনও int এবং একটি NUL পাস করি তবে আমি মনে করি নন-নাল মানটি ফিরে পাওয়া আরও সাধারণ, তাই ফাংশনটি সর্বাধিক (এক্স, y) এবং ইসনুল (এক্স, ওয়াই) এর সংমিশ্রণ হিসাবে কাজ করছে। অতএব আমি ব্যক্তিগতভাবে সর্বশেষ লাইনটি পরিবর্তিত করব: ইসনুল (@ ভাল 1, @ ভাল 2) ফিরিয়ে দিন - যা অবশ্যই আপনাকে শুরু করতে হবে :)
রেডক্যালাক্স

@ দ্য লাস্টার, মার্কের মন্তব্য দেখুন
ক্রিস্টফ

1
এটি অবিশ্বাস্যরূপে ধীর হয়ে উঠবে, কারণ সমস্ত জিনিস স্কলারার ইউডিএফ। পরিবর্তে ইনলাইন ইউডিএফ ব্যবহার করুন
একে

4

এটি এর মতোই সহজ:

CREATE FUNCTION InlineMax
(
    @p1 sql_variant,
    @p2 sql_variant
)  RETURNS sql_variant
AS
BEGIN
    RETURN CASE 
        WHEN @p1 IS NULL AND @p2 IS NOT NULL THEN @p2 
        WHEN @p2 IS NULL AND @p1 IS NOT NULL THEN @p1
        WHEN @p1 > @p2 THEN @p1
        ELSE @p2 END
END;

পূর্ববর্তী উত্তরে @ নীলের মন্তব্য দেখুন SELECT dbo.InlineMax (CAST (0.5 AS ফ্লাট), 100) ভুল is
লুকা

4
SELECT o.OrderId,   
--MAX(o.NegotiatedPrice, o.SuggestedPrice)  
(SELECT MAX(v) FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) as ChoosenPrice  
FROM Order o

ব্যাখ্যার জন্য দয়া করে এই নিবন্ধটি পরামর্শ করুন: red-gate.com/simple-talk/sql/sql-training/…
টম আরলেথ

2
দয়া করে কেবল একটি লিঙ্কের মাধ্যমে আপনার কোডে প্রয়োজনীয় তথ্য অন্তর্ভুক্ত করবেন না। কল্পনা করুন যে এই লিঙ্কটি একদিন শেষ হয়ে যাবে এবং আপনার উত্তরটি তখন অকেজো হয়ে যাবে। সুতরাং দয়া করে এগিয়ে যান এবং সরাসরি আপনার উত্তরে প্রয়োজনীয় তথ্য যুক্ত করুন। অন্যদের আরও তথ্য সন্ধানের জন্য আপনি এখনও সেই লিঙ্কটি রিসোর্স হিসাবে সরবরাহ করতে পারেন।
এল। গুথার্ট

3

ওহো, আমি এই প্রশ্নের একটি ডুপ পোস্ট করেছি ...

উত্তরটি হ'ল, ওরাকল এর গ্রেটেস্টের মতো কার্যকরী কোনও বিল্ট নেই , তবে আপনি একটি ইউডিএফ দিয়ে 2 টি কলামের জন্য অনুরূপ ফলাফল অর্জন করতে পারেন, দ্রষ্টব্য, এখানে স্ক্যাল_ভিয়ারেন্টের ব্যবহার বেশ গুরুত্বপূর্ণ।

create table #t (a int, b int) 

insert #t
select 1,2 union all 
select 3,4 union all
select 5,2

-- option 1 - A case statement
select case when a > b then a else b end
from #t

-- option 2 - A union statement 
select a from #t where a >= b 
union all 
select b from #t where b > a 

-- option 3 - A udf
create function dbo.GREATEST
( 
    @a as sql_variant,
    @b as sql_variant
)
returns sql_variant
begin   
    declare @max sql_variant 
    if @a is null or @b is null return null
    if @b > @a return @b  
    return @a 
end


select dbo.GREATEST(a,b)
from #t

ক্রিস্টফ

এই উত্তর পোস্ট করেছেন:

create table #t (id int IDENTITY(1,1), a int, b int)
insert #t
select 1,2 union all
select 3,4 union all
select 5,2

select id, max(val)
from #t
    unpivot (val for col in (a, b)) as unpvt
group by id

1
দ্রষ্টব্য: গ্রেটস্ট ফাংশন বাস্তবায়ন 2 টি প্যারামের জন্য ওরাকল আচরণের সাথে মিলবে, যদি কোনও পরম নাল হয় তবে তা বাতিল হয়ে যাবে
স্যাম সাফ্রন

2
Sql_variant ব্যবহার করার সময় আপনার সতর্কতা অবলম্বন করা উচিত। আপনার ক্রিয়াকলাপটি নিম্নলিখিত পরিস্থিতিতে একটি অপ্রত্যাশিত ফলাফল দেবে: নির্বাচন করুন ডিবিওরেটেস্ট (ক্যাসেট (0.5 টি ফ্ল্যাট), 100)
নীল

@ নীল ঠিকই আছে (আমি এটি শক্তভাবে শিখেছি), এই জাতীয় সমস্যা রোধ করতে আপনি কীভাবে এই কার্যকারিতাটির উন্নতি করবেন?
লুকা

3

এখানে এমন একটি উদাহরণ রয়েছে যা নালগুলি পরিচালনা করতে পারে এবং এমএসএসকিউএল এর পুরানো সংস্করণগুলির সাথে কাজ করবে। এটি জনপ্রিয় উদাহরণগুলির মধ্যে একটিতে ইনলাইন ফাংশনের উপর ভিত্তি করে:

case
  when a >= b then a
  else isnull(b,a)
end

2

আমি সম্ভবত এটি এইভাবে করব না, কারণ এটি ইতিমধ্যে উল্লিখিত সিএসই নির্মানের তুলনায় কম দক্ষ - যদি না হয়, সম্ভবত, আপনার উভয় প্রশ্নের জন্য সূচিপত্রের আওতা না থাকলে। যে কোনও উপায়ে, এটি একই ধরণের সমস্যার জন্য দরকারী কৌশল:

SELECT OrderId, MAX(Price) as Price FROM (
   SELECT o.OrderId, o.NegotiatedPrice as Price FROM Order o
   UNION ALL
   SELECT o.OrderId, o.SuggestedPrice as Price FROM Order o
) as A
GROUP BY OrderId

2

বড় সংখ্যক সম্পর্কিত উপরের উত্তরের জন্য, আপনি সংযোজন / বিয়োগের আগে গুণ করতে পারেন। এটি কিছুটা বাল্কিয়ার তবে এর কোনও requiresালাই দরকার নেই। (আমি গতির পক্ষে কথা বলতে পারি না তবে আমি ধরে নিলাম এটি এখনও বেশ দ্রুত)

0.5 * ((@ ভাল 1 + @ ভাল 2) + এবিএস (@ ভাল 1 - @ ভাল 2)) নির্বাচন করুন

পরিবর্তন

@ ভাল1 * 0.5 + @ ভাল 2 * 0.5 + এবিএস (@ ভাল 1 * 0.5 - @ ভাল 2 * 0.5) নির্বাচন করুন

যদি আপনি কাস্টিং এড়াতে চান তবে কমপক্ষে একটি বিকল্প।


2

এখানে নুল হ্যান্ডলিং সহ একটি আইআইএফ সংস্করণ রয়েছে (জিনের উত্তরের ভিত্তিতে):

IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a > b, a, b))

যুক্তিটি নিম্নরূপ: মানগুলির মধ্যে যদি দুটিই নুল হয় তবে সেই মানটি ফেরত দিন যা নুল নয় (যদি উভয়ই নুল হয় তবে একটি ন্যূন ফিরিয়ে দেওয়া হয়)। অন্যথায় বৃহত্তর এক ফিরে।

এমআইএন-এর জন্যও একই কাজ করা যেতে পারে।

IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a < b, a, b))


1
SELECT o.OrderID
CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN
 o.NegotiatedPrice
ELSE
 o.SuggestedPrice
END AS Price

1
CREATE FUNCTION [dbo].[fnMax] (@p1 INT, @p2 INT)
RETURNS INT
AS BEGIN

    DECLARE @Result INT

    SET @p2 = COALESCE(@p2, @p1)

    SELECT
        @Result = (
                   SELECT
                    CASE WHEN @p1 > @p2 THEN @p1
                         ELSE @p2
                    END
                  )

    RETURN @Result

END

1

এর সহজতম আকারে ...

CREATE FUNCTION fnGreatestInt (@Int1 int, @Int2 int )
RETURNS int
AS
BEGIN

    IF @Int1 >= ISNULL(@Int2,@Int1)
        RETURN @Int1
    ELSE
        RETURN @Int2

    RETURN NULL --Never Hit

END

1

এসকিউএল সার্ভার ২০১২ এর জন্য:

SELECT 
    o.OrderId, 
    IIF( o.NegotiatedPrice >= o.SuggestedPrice,
         o.NegotiatedPrice, 
         ISNULL(o.SuggestedPrice, o.NegiatedPrice) 
    )
FROM 
    Order o

1

এখানে সরল নুল হ্যান্ডলিংয়ের সাথে @ স্কট ল্যাংহ্যামের উত্তর দেওয়া হয়েছে:

SELECT
      o.OrderId,
      CASE WHEN (o.NegotiatedPrice > o.SuggestedPrice OR o.SuggestedPrice IS NULL) 
         THEN o.NegotiatedPrice 
         ELSE o.SuggestedPrice
      END As MaxPrice
FROM Order o


0
 -- Simple way without "functions" or "IF" or "CASE"
 -- Query to select maximum value
 SELECT o.OrderId
  ,(SELECT MAX(v)
   FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) AS MaxValue
  FROM Order o;

এর VALUESমতো ইনলাইনটির আকর্ষণীয় ব্যবহারের সময় , আমি নিশ্চিত নই যে এটি এর চেয়ে সহজ CASEবা IFF। আমি এই সমাধানটির পারফরম্যান্সটি অন্য বিকল্পগুলির তুলনায় কীভাবে দাঁড়ায় তা জানতে আগ্রহী
ক্রিস শ্যাচলার

0

জিনের উত্তরটি প্রসারিত করা এবং তুলনা মানের ধরণটি INT হিসাবে ধরে নেওয়া, এই পদ্ধতিটিও কার্যকর:

SELECT IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)

উদাহরণস্বরূপ মানগুলির সাথে এটি একটি সম্পূর্ণ পরীক্ষা:

DECLARE @A AS INT
DECLARE @B AS INT

SELECT  @A = 2, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2

SELECT  @A = 2, @B = 3
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 3

SELECT  @A = 2, @B = NULL
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2    

SELECT  @A = NULL, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 1

0

মেমএসকিউএলে নিম্নলিখিতগুলি করুন:

-- DROP FUNCTION IF EXISTS InlineMax;
DELIMITER //
CREATE FUNCTION InlineMax(val1 INT, val2 INT) RETURNS INT AS
DECLARE
  val3 INT = 0;
BEGIN
 IF val1 > val2 THEN
   RETURN val1;
 ELSE
   RETURN val2;
 END IF; 
END //
DELIMITER ;

SELECT InlineMax(1,2) as test;

-1

Presto এ আপনি ব্যবহার করতে পারেন

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