ما يعادل كيو لأعلى ن مع العلاقات:الحد "مع العلاقات"?

StackOverflow https://stackoverflow.com//questions/9629953

سؤال

أنا أبحث عن شيء مماثل هذا في سكل سيرفر:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top