ما يعادل كيو لأعلى ن مع العلاقات:الحد "مع العلاقات"?
-
09-12-2019 - |
سؤال
أنا أبحث عن شيء مماثل هذا في سكل سيرفر:
SELECT TOP n WITH TIES FROM tablename
أنا أعرف عن LIMIT
في كيو, ولكن هل ما يعادل ما سبق موجودة?أنا مجرد فضول لأنه سيوفر استعلاما إضافيا في كل مرة بالنسبة لي.
إذا كان لدي طاولة Numbers
مع السمة nums
: {10, 9, 8, 8, 2}
.أريد أن أفعل شيئا مثل:
SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3
يجب أن يعود {10, 9, 8, 8}
لأنه يأخذ أعلى 3 بالإضافة إلى اضافية 8
لأنه يربط الآخر.
المحلول
لا يوجد WITH TIES
بند في كيو مثل هناك في سكل سيرفر.
في كيو وأود أن استبدال هذا ل TOP n WITH TIES .. ORDER BY <something>
:
WITH cte AS (
SELECT *, rank() OVER (ORDER BY <something>) AS rnk
FROM tbl
)
SELECT *
FROM cte
WHERE rnk <= n;
أن تكون واضحة, rank()
صحيح, dense_rank()
سيكون خطأ (إرجاع عدد كبير جدا من الصفوف).
النظر في هذا الاقتباس من مستندات سكل سيرفر (من الرابط أعلاه):
على سبيل المثال ، إذا تم تعيين التعبير إلى 5 ولكن 2 صفوف إضافية تطابق قيم الترتيب حسب الأعمدة في الصف 5 ، ستحتوي مجموعة النتائج على 7 الصفوف.
وظيفة WITH TIES
هو تضمين جميع أقران الصف الأخير في الأعلى n كما هو محدد من قبل ORDER BY
بند. rank()
يعطي نفس النتيجة بالضبط.
للتأكد ، اختبرت مع سكل سيرفر ، وهنا هو عرض حي.
وهنا هو أكثر ملاءمة سكلفيدل.
نصائح أخرى
جرب هذا:
الناتج:10, 9, 8, 8
with numbers (nums) as (
values (10), (9), (8), (8), (2)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC
الناتج:10,10,9,8,8
with numbers (nums) as (
values (10), (9), (8), (8), (2), (10)
)
SELECT nums FROM Numbers
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3)
ORDER BY nums DESC