كيف تعمل DENSE_RANK دون فجوات في الترتيب؟

سهلقراءة دقيقةآخر تحديث 3 أكتوبر 2026

SQL قواعد البيانات

الإجابة

تمنح الدالة DENSE_RANK() رتبة مشتركة للصفوف التي تتساوى في قيم ترتيب النافذة. وعندما تنتقل إلى قيمة مختلفة، تزيد الرتبة بمقدار واحد فقط، مهما كان عدد الصفوف التي تشاركت الرتبة السابقة. لذلك تكون الرتب متتابعة من دون أرقام مفقودة بينها.

يفيد هذا السلوك في الأسئلة التي تتحدث عن مستويات مختلفة، مثل ثاني أعلى راتب مميز أو أعلى ثلاثة تقييمات مختلفة للأفلام. نحن هنا نهتم بعدد القيم المختلفة التي تسبق القيمة الحالية، وليس بعدد الصفوف الفعلي الذي يسبق الموظف أو الفيلم.

مثال

WITH movies AS (
  SELECT 1 AS id, 9 AS rating
  UNION ALL SELECT 2, 9
  UNION ALL SELECT 3, 8
)
SELECT id, rating,
       DENSE_RANK() OVER (ORDER BY rating DESC) AS rating_rank
FROM movies
ORDER BY id;

يشترك الفيلمان صاحبا التقييم تسعة في الرتبة الأولى، ويحصل التقييم ثمانية على الرتبة الثانية. لا تزيل الدالة أي فيلم من النتيجة. وإذا احتجنا إلى صف واحد لكل تقييم، فعلينا معالجة التكرار بصورة منفصلة عن حساب الرتبة.

باختصار: ترتب DENSE_RANK() القيم المختلفة بالتتابع، وتحافظ على رتبة مشتركة للصفوف المتعادلة دون ترك فجوات.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما قيم rating_rank حسب ترتيب id في نتيجة الاستعلام التالي؟

CREATE TABLE movies (
  id INT PRIMARY KEY,
  rating INT NOT NULL
);
INSERT INTO movies (id, rating) VALUES
(1, 9), (2, 9), (3, 8), (4, 8), (5, 6);

SELECT id,
       DENSE_RANK() OVER (ORDER BY rating DESC) AS rating_rank
FROM movies
ORDER BY id;