এসকিউএল সার্ভার কি সাধারণ কাজটি না হলে গ্রেটস্ট এবং লেস্টকে সমর্থন করে?


20

এই প্রশ্নটি পর্যালোচনা করে দেখে মনে হচ্ছে এটি অনেক কাজ যা প্রয়োজন হবে না। তারা একটি তারিখ সহ একটি ব্যাপ্তি প্রসারিত করার চেষ্টা করছে। অন্যান্য ডাটাবেসে, আপনি কেবল ব্যবহার করবেন greatestএবং least..

least(extendDate,min), greatest(extendDate,max)

আমি যদিও এগুলি ব্যবহার করার চেষ্টা করি, আমি পাই

'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.

এটি উভয় দিকেই প্রসারকে কভার করবে।

প্রশ্নের উদ্দেশ্যে, আপনাকে এখনও একচেটিয়া পরিসীমা প্রতিস্থাপন করতে হবে।

আমি কেবল ভাবছি যে এসকিউএল সার্ভার ব্যবহারকারীরা কীভাবে নিদর্শনগুলি leastএবং greatestকার্যকারিতাটিতে প্রয়োগ করে।

আপনি কি শর্তাদি CASEবিবৃতিতে তালিকাভুক্ত করবেন বা কোনও এক্সটেনশন, তৃতীয় পক্ষের অ্যাড-অন, বা মাইক্রোসফ্টের লাইসেন্স রয়েছে যা এই কার্যকারিতাটি সক্ষম করে?


2
feedback.azure.com/forums/908035-sql-server/suggestions/... যদি এই জন্য ভোট দিতে চাই
জে Brune

উত্তর:


33

একটি সাধারণ পদ্ধতি হ'ল VALUESধারাটি ব্যবহার করা , এবং CROSS APPLYদুটি কলাম একটি একক কলাম হিসাবে আলাদা করা, তারপরে প্রতিটি MINএবং MAXতার দুটি পান।

SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
FROM   dbo.Users AS u
CROSS APPLY ( VALUES ( u.CreationDate ), ( u.LastAccessDate )) AS x ( CombinedDate );

এটি লেখার অন্যান্য উপায় রয়েছে, উদাহরণস্বরূপ ব্যবহার UNION ALL

SELECT MIN(x.CombinedDate) AS least, MAX(x.CombinedDate) AS greatest
FROM   dbo.Users AS u
CROSS APPLY ( SELECT u.CreationDate UNION ALL SELECT u.LastAccessDate ) AS x(CombinedDate);

যাইহোক, ফলাফলের ক্যোয়ারী পরিকল্পনাগুলি একই বলে মনে হচ্ছে।




3

সর্বনিম্ন সমতুল্য:

IIF(@a < @b, @a, @b)

সবচেয়ে বড় সমতুল্য:

IIF(@a > @b, @a, @b)

3
আপনি কীভাবে তিন বা ততোধিক মানগুলির জন্য এটি করেন least(5,6,7,8,9)?
a_horse_with_no_name

@a_horse_with_no_name নেস্টেড IIF এর ব্যবহার করুন
এলনুর

এই পদ্ধতির পড়া এবং যাচাই করা দ্রুত চ্যালেঞ্জ হয়ে উঠবে ... পারফরম্যান্সের ক্ষেত্রে এটি কীভাবে ভাড়া?
ডডোকাফোন

0

আমি ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন তৈরি করি, যেমন

create function dbo.udf_LeastInt(@a int, @b int)
returns int
with schemabinding
as
begin
  return case when @a <= @b then @a 
              when @b < @a  then @b
              else null
         end
end

যদিও এটি সাধারণ ক্ষেত্রে কাজ করতে পারে তবে এই পদ্ধতির সাথে বেশ কয়েকটি সমস্যা রয়েছে:

  • বিরক্তিকরভাবে আপনাকে প্রতিটি ডেটা টাইপের জন্য পৃথক ফাংশন করতে হবে।
  • এটি কেবলমাত্র 2 টি প্যারামিটার পরিচালনা করে, তাই অনেকগুলি পরামিতিগুলি পরিচালনা করতে বা একই ফাংশনের নেস্টেড কলগুলি ব্যবহার করতে একজনের আরও ফাংশন প্রয়োজন হতে পারে।
  • এটি একটি স্কেলারের ফাংশনের চেয়ে একটি ইনলাইন টিভিএফ হিসাবে ভাল (আরও দক্ষ) হবে। এটি মস্তিষ্কে স্কেলার ফাংশনগুলির প্রয়োগের সাথে সম্পর্কিত। এটি সম্পর্কে অনেক ব্লগ আছে, উদাহরণস্বরূপ দেখুন স্কালে ব্যবহারকারী বর্ণিত কার্যাবলী (জন Kehayias দ্বারা - সমান্তরালতা ইনহিবিটারস: এসকিউএল 101
  • আর্গুমেন্টগুলির একটি যদি শূন্য হয়, তবে এটি নাল দেয়। এটি leastঅপারেটর ওরাকল এবং মাইএসকিউএল-এ কী করে তার সাথে মেলে তবে পোস্টগ্রিস থেকে পৃথক। তবে শূন্যের বিরুদ্ধে এই আর্মুরিং এটিকে আরও ভার্জোজ করে তোলে (যদি আপনি জানেন যে তারা নাল হবে না, একটি সমতল case when @a <= @b then @a else @b endকাজ করবে)।

সব মিলিয়ে caseপারফরম্যান্সের বিষয়টি বিবেচনায় থাকলে দীর্ঘক্ষণ বিবৃতিটি লিখে রাখা ভাল out caseতুলনা করার জন্য কয়েকটি মান থাকলে আমি এমনকি ক্লায়েন্টের পক্ষের নেস্টেড স্টেটমেন্টগুলি উত্সাহিত করেছি ।


0

আমি @ এড-অ্যাভিস উত্তরে মন্তব্য যুক্ত করার ইচ্ছা ছিলাম, তবে খ্যাতি অভাবের কারণে এটি করতে পারছি না, তাই এটি তার উত্তরের জন্য এক্সটেনশন হিসাবে পোস্ট করছি।

"বিরক্তিকরভাবে আপনাকে প্রতিটি ডেটা টাইপের জন্য আলাদা ফাংশন করতে হবে।" SQL_VARIANT ব্যবহার করা হচ্ছে

আমার বাস্তবায়ন এখানে:

CREATE OR ALTER FUNCTION my_least(@a SQL_VARIANT, @b SQL_VARIANT)
returns SQL_VARIANT
with schemabinding
as
begin
  return case when @a <= @b then @a 
              when @b < @a  then @b
              WHEN @a IS NULL THEN @b
              WHEN @b IS NULL THEN @a
              else null
         end
END;

এছাড়াও এই ফাংশন হ্যান্ডলগুলি শূন্য PostgreSQL সংস্করণ মত s।

সুবিধার জন্য এই ফাংশনটি ডিবিতে যুক্ত করা যেতে পারে তবে অন্তর্নির্মিত ব্যবহারের চেয়ে 10 গুণ ধীরIIF । আমার পরীক্ষার শো, সঠিক প্রকার (সঙ্গে এই ধরনের ফাংশন যা DATETIME ) হিসাবে একই সঞ্চালিত sql_variant সংস্করণ।

PS আমি 350k মানগুলির ডেটা-সেটটিতে কিছু পরীক্ষা চালিয়েছি, এবং মনে হয় যে পারফরম্যান্স একই, sql_variant খুব সামান্য দ্রুত, তবে আমি বিশ্বাস করি এটি কেবল জিটটার।

তবে যে কোনও উপায়ে আইআইএফ সংস্করণ 10x গুণ বেশি দ্রুত !!!

আমি ইনলাইন পরীক্ষা করিনি CASE WHENতবে মূলত টি-স্কেল আইআইএফের ক্ষেত্রে একই , এবং যদি আইটিএফ অপ্টিমাইজার দ্বারা কেস এক্সপ্রেশনতে রূপান্তরিত হয়।

আইআইএফ সিএএসই-তে অনুবাদ করা এই কার্যকারিতার আচরণের অন্যান্য দিকগুলিতেও প্রভাব ফেলে।

উপসংহার: পারফরম্যান্সের বিষয়টি বিবেচনা করে আইআইএফ ব্যবহার করা তত দ্রুত , তবে প্রোটোটাইপিংয়ের জন্য, বা কোডের স্পষ্টতা বেশি প্রয়োজন হলে এবং কোনও বড় গণনা জড়িত নেই, প্রদত্ত ফাংশনটি ব্যবহার করা যেতে পারে।


অন্তত () এবং গ্রেটস্ট (), যখন কোনও এসকিউএল উপভাষায় উপস্থিত থাকে, n কলামগুলির মধ্যে একটি সারির মধ্যে তুলনার অনুমতি দেয়; সমতুল্য ফলাফল প্রদান করবে এমন সমাধানের পরে আমি ওপিকে নিয়েছি। উত্তর এখানে (বেশ কয়েক জন সহ) শুধুমাত্র 2. সমর্থন
Dodecaphone
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.