গুরুত্বপূর্ণ: দয়া করে মাইএসকিউএল 8+ এ আপগ্রেড করার কথা বিবেচনা করুন এবং সংজ্ঞায়িত এবং ডকুমেন্টেড ROW_NUMBER () ফাংশনটি ব্যবহার করুন এবং মাইএসকিউএল-র বৈশিষ্ট্য সীমিত প্রাচীন সংস্করণে আবদ্ধ পুরানো হ্যাকগুলি খনন করুন
এখন এই হ্যাকগুলির মধ্যে একটি:
এখানে যে উত্তরগুলি ইন-কোয়েরি ভেরিয়েবলগুলি ব্যবহার করে / বেশিরভাগই ডকুমেন্টেশন বলে (প্যারাফ্রেজ) বলে তা উপেক্ষা করে বলে মনে হচ্ছে:
উপরে থেকে নীচে ক্রমে মূল্যায়ন করা হচ্ছে SELECT তালিকার আইটেমগুলির উপর নির্ভর করবেন না। একটি নির্বাচন আইটেমে ভেরিয়েবল বরাদ্দ করবেন না এবং অন্য একটিতে সেগুলি ব্যবহার করবেন না
এই হিসাবে, তাদের একটি ভুল ঝুঁকি রয়েছে যে তারা ভুল উত্তরটি ছড়িয়ে দেবে, কারণ তারা সাধারণত একটি করে
select
(row number variable that uses partition variable),
(assign partition variable)
এগুলি যদি নীচে আপকে মূল্যায়ন করা হয় তবে সারি নম্বর কাজ করা বন্ধ করবে (কোনও পার্টিশন নেই)
সুতরাং আমাদের কার্যকর গ্যারান্টিযুক্ত আদেশ সহ কিছু ব্যবহার করতে হবে। পরিস্থিতি যখন প্রবেশ করুন:
SELECT
t.*,
@r := CASE
WHEN col = @prevcol THEN @r + 1
WHEN (@prevcol := col) = null THEN null
ELSE 1 END AS rn
FROM
t,
(SELECT @r := 0, @prevcol := null) x
ORDER BY col
বাহ্যরেখা এলডি হিসাবে, প্রডকোলের কার্যক্রমের ক্রমটি গুরুত্বপূর্ণ - প্রব্যাকলকে বর্তমান সারিটির একটি মান নির্ধারণের পূর্বে বর্তমান সারির মানটির সাথে তুলনা করতে হবে (অন্যথায় এটি বর্তমান সারিগুলির করল মান হবে, পূর্ববর্তী সারির কোলের মান নয়) ।
এটি কীভাবে একসাথে ফিট হয় তা এখানে:
প্রথম WHEN মূল্যায়ন করা হয়। যদি এই সারির কর্নটি আগের সারির কর্নের মতো হয় তবে @ আর বাড়ানো হয় এবং CASE থেকে ফিরে আসে। এই রিটার্নের নেতৃত্বাধীন মানগুলিতে @ আরআর সংরক্ষণ করা হয়। এটি মাইএসকিউএল এর একটি বৈশিষ্ট্য যা অ্যাসাইনমেন্টটি ফলাফলকে সারিগুলিতে @ আর এর মধ্যে যা বরাদ্দ করা হয়েছে তার নতুন মান প্রদান করে।
ফলাফলের সেটটিতে প্রথম সারির জন্য, @ প্রিভকোলটি নাল (এটি সাবকোয়ারিতে নাল থেকে শুরু করা হয়েছে) সুতরাং এই ভবিষ্যদ্বাণীটি মিথ্যা। এই প্রথম শিকারী প্রতি বার কর্ন পরিবর্তন হওয়ার সাথেও মিথ্যা ফেরত দেয় (বর্তমান সারিটি আগের সারির চেয়ে পৃথক)। এটি দ্বিতীয় WHEN মূল্যায়নের কারণ হয়।
দ্বিতীয় WHEN এর পূর্বাভাস সর্বদা মিথ্যা এবং @Prevcol এ একটি নতুন মান নির্ধারণের জন্য এটি বিশুদ্ধরূপে বিদ্যমান। কারণ এই সারির কর্নটি আগের সারির কর্নের থেকে আলাদা (আমরা এটি জানি কারণ এটি যদি একই থাকে তবে প্রথম WHEN ব্যবহার করা হত), পরের বারের পরীক্ষার জন্য আমাদের নতুন মান নির্ধারণ করতে হবে। যেহেতু অ্যাসাইনমেন্টটি করা হয় এবং তারপরে অ্যাসাইনমেন্টের ফলাফলটি নলের সাথে তুলনা করা হয়, এবং নলের সাথে সমান যে কোনও কিছু মিথ্যা, এই শিকারী সর্বদা মিথ্যা। তবে কমপক্ষে এটির মূল্যায়ন করা এই সারিটি থেকে কর্নেলের মান রাখার কাজ করেছে, সুতরাং এটি পরবর্তী সারির কর্নমূল্যের তুলনায় মূল্যায়ন করা যেতে পারে
দ্বিতীয় WHEN টি মিথ্যা বলে এর অর্থ এমন পরিস্থিতিতে রয়েছে যেখানে আমরা (কল) দিয়ে বিভাজন করছি কলামটি পরিবর্তিত হয়েছে, এটি ELSE যা @r এর জন্য একটি নতুন মান দেয়, 1 থেকে নম্বরটি পুনরায় আরম্ভ করে
আমরা এটি এমন পরিস্থিতিতে পৌঁছেছি যেখানে এটি:
SELECT
t.*,
ROW_NUMBER() OVER(PARTITION BY pcol1, pcol2, ... pcolX ORDER BY ocol1, ocol2, ... ocolX) rn
FROM
t
সাধারণ ফর্ম আছে:
SELECT
t.*,
@r := CASE
WHEN col1 = @pcol1 AND col2 = @pcol2 AND ... AND colX = @pcolX THEN @r + 1
WHEN (@pcol1 := pcol1) = null OR (@pcol2 := col2) = null OR ... OR (@pcolX := colX) = null THEN null
ELSE 1
END AS rn
FROM
t,
(SELECT @r := 0, @pcol1 := null, @pcol2 := null, ..., @pcolX := null) x
ORDER BY pcol1, pcol2, ..., pcolX, ocol1, ocol2, ..., ocolX
পাদটিকা:
পি-সি-পি-এর অর্থ "পার্টিশন", ওকোলে ও-র অর্থ "অর্ডার" - সাধারণ আকারে আমি ভিজ্যুয়াল ক্লাটারকে হ্রাস করতে ভেরিয়েবল নাম থেকে "পূর্ব" বাদ দিলাম
চারপাশে বন্ধনী (@pcolX := colX) = null
গুরুত্বপূর্ণ। এগুলি ছাড়াই আপনি @pcolX এ নাল বরাদ্দ করবেন এবং জিনিসগুলি কাজ করা বন্ধ করবে
এটি একটি সমঝোতা যে ফলাফল সেটটি পূর্ববর্তী কলামটির তুলনায় কাজ করার জন্য পার্টিশন কলামগুলিও অর্ডার করতে হবে। আপনি এইভাবে আপনার রনবার্টটিকে একটি কলাম অনুসারে অর্ডার করতে পারবেন না তবে আপনার ফলাফল সেটটি অন্যটিকে আদেশ করা হয়েছে আপনি এটিকে সাবকিউয়ের সাথে সমাধান করতে সক্ষম হতে পারেন তবে আমি বিশ্বাস করি যে ডকুমেন্টগুলি আরও বলে যে লিমিটেড ব্যবহার না করা হলে সাব-কোয়ের অর্ডার অগ্রাহ্য করা যেতে পারে এবং এটি প্রভাব ফেলতে পারে কর্মক্ষমতা
পদ্ধতিটি কাজ করে যাচাই করার বাইরে আমি এগুলিতে প্রবেশ করি নি, তবে দ্বিতীয় ঝুঁকির মধ্যে যদি ভবিষ্যদ্বাণী করা হয় তবে অপটিমাইজ করা হবে (নাল তুলনায় যে কোনও কিছুই নাল / মিথ্যা তাই অ্যাসাইনমেন্ট চালানো কেন বিরক্ত করবে) এবং মৃত্যুদন্ড কার্যকর করা হবে না , এটিও থামে। আমার অভিজ্ঞতায় এটি ঘটবে বলে মনে হচ্ছে না তবে আমি আনন্দের সাথে মন্তব্যগুলি গ্রহণ করব এবং যদি যুক্তিসঙ্গতভাবে ঘটতে পারে তবে সমাধানের প্রস্তাব দেব
@PcolX ভেরিয়েবলগুলি তৈরি করে এমন সাব-কোয়রিতে আপনার কলামগুলির প্রকৃত প্রকারগুলিতে @pcolX তৈরি করা নালগুলি নিক্ষেপ করা বুদ্ধিমানের কাজ হতে পারে: select @pcol1 := CAST(null as INT), @pcol2 := CAST(null as DATE)
greatest-n-per-group
আপনাকে অনুরূপ প্রশ্নের জন্য গাইড করতে ট্যাগ করা হয়েছে।