আমি দেখতে পাচ্ছি যে এটি করার জন্য অনেক লোক সাবকিউরিয়াস বা অন্য বিক্রেতা-নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করে তবে আমি প্রায়শই নিম্নলিখিত পদ্ধতিতে সাবকিউরিটি ছাড়াই এই জাতীয় কোয়েরি করি। এটি সাধারণ, স্ট্যান্ডার্ড এসকিউএল ব্যবহার করে যাতে এটি কোনও ব্র্যান্ডের আরডিবিএমএসে কাজ করা উচিত।
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.UserId = t2.UserId AND t1."Date" < t2."Date")
WHERE t2.UserId IS NULL;
অন্য কথায়: যে সারিটি t1
একই UserId
এবং বৃহত্তর তারিখের সাথে উপস্থিত নেই সেখান থেকে সারিটি আনুন ।
(আমি সনাক্তকারী "তারিখ" প্রেরকগুলিতে রেখেছি কারণ এটি একটি এসকিউএল সংরক্ষিত শব্দ))
ক্ষেত্রে যদি t1."Date" = t2."Date"
, দ্বিগুণ উপস্থিত হয়। সাধারণত টেবিলগুলির auto_inc(seq)
কী থাকে, যেমন id
। দ্বিগুণ এড়াতে নিম্নলিখিত ব্যবহার করা যেতে পারে:
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.UserId = t2.UserId AND ((t1."Date" < t2."Date")
OR (t1."Date" = t2."Date" AND t1.id < t2.id))
WHERE t2.UserId IS NULL;
@ ফারহানের মন্তব্য:
এখানে আরও বিস্তারিত ব্যাখ্যা দেওয়া হয়েছে:
একটি বহিরাগত যোগদানের t1
সাথে যোগদানের চেষ্টা করে t2
। ডিফল্টরূপে, সমস্ত ফলাফল t1
ফিরে আসে, এবং যদি কোনও মিল t2
থাকে তবে তাও ফিরে আসে। যদি t2
প্রদত্ত সারির জন্য কোনও মিল না থাকে t1
, তবে কোয়েরিটি এখনও সারিটি দেয় t1
এবং NULL
সমস্ত t2
কলামের স্থানধারক হিসাবে ব্যবহার করে । সাধারণভাবে বাহ্যিকভাবে যোগ দেয় এমনভাবেই।
এই ক্যোয়ারীতে কৌতুক এর ম্যাচিং শর্ত যেমন যে যোগদানের ডিজাইন করতে হয় t2
মেলানো একই userid
, এবং একটি বৃহত্তর date
। ধারণা একটি সারিতে যদি উপস্থিত থাকে হচ্ছে t2
একটি বেশি date
, তারপর সারি t1
বিরুদ্ধে তুলনা হচ্ছে করতে পারবেন বড় বলা হবে date
যে জন্য userid
। তবে যদি কোনও মিল না থাকে - অর্থাত্ যদি কোনও সারি এর চেয়ে t2
বড় সারিটির সাথে উপস্থিত না থাকে - আমরা জানি যে সারিটি সারিটি প্রদত্তদের জন্য সর্বাধিক সহ সারি ছিল ।date
t1
t1
date
userid
এই ক্ষেত্রে (যখন কোনও মিল নেই), এর কলামগুলি t2
হবে NULL
- এমনকি যোগদানের শর্তে নির্দিষ্ট কলামগুলিও। সুতরাং আমরা কেন ব্যবহার করি WHERE t2.UserId IS NULL
, কারণ আমরা সেই ক্ষেত্রে অনুসন্ধান করছি যেখানে প্রদত্তর date
জন্য বৃহত্তর কোনও সারি পাওয়া যায় নি userid
।