ماڈیول اسباق (2/4)
ونڈو کے افعال: درجہ بندی اور فی گروپ کیلکولیشن
ایک ونڈو فنکشن ایک فنکشن ہے جو "قطاروں کے گروپ" پر کام کرتا ہے۔
(window_) لیکن — GROUP BY کے برعکس — کی تعداد کو کم نہیں کرتا
rows: ونڈو پر شمار کی جانے والی ایک قدر کی ہر قطار کے ساتھ منسلک ہے۔
حتمی نتیجہ.
درجہ بندی، ترقی پسند نمبر، فیصد کے لیے یہ صحیح ٹول ہے۔
مجموعی طور پر ایک گروپ سے زیادہ، اور بہت سے دوسرے آپریشنز جو عجیب ہیں یا
GROUP BY کے ساتھ ناممکن۔
نحو: function() OVER (…)
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)اجزاء:
PARTITION BY— "گروپوں" کی وضاحت کرتا ہے (جیسےGROUP BY، لیکن قطاریں الگ رہنا؛ORDER BYOVER(…)کے اندر — آرڈر کی وضاحت کرتا ہے ** کے اندر** تقسیم
OVER () (خالی قوسین) کا مطلب ہے "پوری میز بطور ایک ونڈو"۔
"کل کا فیصد" جیسے حساب کے لیے مفید ہے۔
درجہ بندی کے افعال
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK() OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)فرق (اقدار کے ساتھ 100, 100, 90, 80):
| فنکشن | عہدے |
|---|---|
ROW_NUMBER | 1, 2, 3, 4 (ہمیشہ منفرد) |
RANK | 1, 1, 3, 4 (تعلقات ایک پوزیشن کا اشتراک کرتے ہیں، "خالی" چھوڑتے ہیں) |
DENSE_RANK | 1, 1, 2, 3 (تعلقات ایک پوزیشن کا اشتراک کرتے ہیں، بغیر وقفے) |
مثال: مصنوعات کی درجہ بندی فی زمرہ
SELECT name,
category_id,
price,
RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM products
ORDER BY category_id, rank;ہر ایک category_id کے لئے RANK 1 سے دوبارہ شروع ہوتا ہے اور نیچے اتر کر آرڈر کرتا ہے۔
قیمت: آپ کو مصنوعات کی درجہ بندی ہر زمرے کے اندر، ایک میں ملتی ہے۔
گولی مار دی
پروگریسو نمبرنگ
-- Progressive order number for each customer:
SELECT id,
customer_id,
ordered_at,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM orders
ORDER BY customer_id, row_num;ہر صارف کے پہلے آرڈر میں row_num = 1، دوسرا 2 وغیرہ ہوگا۔
اسے آزمائیں
ہر پروڈکٹ کے لیے نام، زمرہ_آئی ڈی، قیمت اور درجہ (زمرہ کے اندر نزولی قیمت کے لحاظ سے درجہ بندی؛ RANK استعمال کریں)۔ صعودی زمرہ_id اور صعودی درجہ کے لحاظ سے ترتیب دیں۔
اشارہ دکھائیں۔
زمرہ_id گروپوں کے لحاظ سے تقسیم، گروپ کے اندر قیمت کے حساب سے DESC آرڈرز۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ہر آرڈر کے لیے id، customer_id، ordered_at اور row_num دکھائیں (ترقی پسند ROW_NUMBER فی گاہک، بڑھتے ہوئے ordered_at کے ذریعے ترتیب دیا گیا)۔ customer_id اور row_num کے حساب سے آرڈر کریں۔
اشارہ دکھائیں۔
ROW_NUMBER پارٹیشن کے اندر ہمیشہ منفرد ہوتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔