ماڈیول اسباق (3/4)
درجہ بندی: ROW_NUMBER، RANK اور DENSE_RANK
درجہ بندی: ROW_NUMBER، RANK اور DENSE_RANK
جمع کرنے کے علاوہ، ونڈو کے افعال ترتیب دینے اور درجہ بندی میں چمکتے ہیں۔ ایسے فنکشنز ہیں جو خاص طور پر ونڈوز کے اندر کام کرنے کے لیے بنائے گئے ہیں (OVER() لازمی ہو جاتا ہے) جو ترتیب وار نمبر یا درجہ بندی کی پوزیشنیں تفویض کرتے ہیں۔
انہیں معیار کے خلاف کام کرنے کے لیے، ہمیں ORDER BY شق اندر OVER() کا استعمال کرنا ہوگا۔
درجہ بندی کی تینوں
ROW_NUMBER(): ہر قطار کو ایک سادہ سیکوینشل نمبر (1, 2, 3...) تفویض کرتا ہے، من مانے تعلقات کو توڑتا ہے۔RANK(): "اولمپکس" کا اثر پیدا کرتا ہے: 1, 2, 2, 4۔ یہ ایک خلا چھوڑتا ہے ("3" کو چھوڑ دیا جاتا ہے) اور تعلقات کی صورت میں وہی درجہ تفویض کرتا ہے۔DENSE_RANK(): درجات کو کثافت کرتا ہے: 1, 2, 2, 3۔ ٹائی کے بعد کبھی بھی فرق نہیں ہوتا ہے۔
SELECT
product_name,
price,
RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;PARTITION BY اور ORDER BY کو ایک ساتھ OVER() کے اندر ملا کر ہم "ہر زمرے کے لیے سرفہرست 3" حاصل کر سکتے ہیں!
کسٹمرز ٹیبل ('کسٹمرز') سے 'first_name'، 'last_name' اور 'id' نکالیں (فرض کریں 'id' شناخت کنندہ نمبر ہے)۔ DENSE_RANK() کا استعمال کرتے ہوئے 'id' کے نزول کی بنیاد پر ایک 'درجہ' کالم شامل کریں (اعلی سے کم تک)۔
اشارہ دکھائیں۔
DENSE_RANK() OVER(ID DESC کے مطابق آرڈر)۔
3 کوششوں کے بعد حل دستیاب ہے۔
مصنوعات ('مصنوعات') کی قیمت کی بنیاد پر ہر ایک 'کیٹگری_آئی ڈی' کے لیے درجہ بندی بنائیں۔ 'category_id'، 'id'، 'price' نکالیں اور ROW_NUMBER() کا استعمال کرتے ہوئے 'price_rank' کو نزولی 'price' ترتیب میں شامل کریں، 'category_id' کے حساب سے تقسیم کریں۔
اشارہ دکھائیں۔
OVER کے اندر BY category_id ORDER BY DESC قیمت کے لحاظ سے پارٹیشن کو یکجا کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔