كيف يمكنني التعامل مع بيانات "المرتبة X خارج y" في postgresql؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

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

يبدو أن الحوارز يقدمون بعض التحديات الفريدة في هذا الصدد؛ AfAict، لا يحتوي على رتبة أو ROW_NUMBER أو وظيفة ما يعادلها (على الأقل في 8.3، والتي عالقة في الوقت الحالي). يبدو أن الإجابة الكننية في قائمة أرشيف القائمة البريدية هي إنشاء تسلسل مؤقت وحدد منه:

test=> create temporary sequence tmp_seq;
CREATE SEQUENCE
test=*> select nextval('tmp_seq') as row_number, col1, col2 from foo;

يبدو أن هذا الحل لا يزال لن يساعد عندما أريد تحديد صف واحد فقط من الجدول (وأريد تحديده بواسطة PK، وليس حسب المرتبة).

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

هل أفتقد شيئا واضحا؟ ما هي الطريقة الصحيحة للقيام بذلك؟

تعديل: على ما يبدو لم أكن واضح بما فيه الكفاية. أنا أدرك الإزاحة / الحد، لكنني لا أرى كيف يساعد في حل هذه المشكلة. أنا لا أحاول اختيار العنصر ذي المرتبة XTH، أحاول اختيار عنصر تعسفي (من قبل PK، كما أقول)، ثم أن أكون قادرا على العرض إلى مستخدم شيء مثل "المرتبة 43 من 312."

هل كانت مفيدة؟

المحلول

إذا كنت تريد الرتبة، افعل شيئا مثل

SELECT id,num,rank FROM (
  SELECT id,num,rank() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

أو إذا كنت تريد فعلا رقم الصف، استخدم

SELECT id,num,row_number FROM (
  SELECT id,num,row_number() OVER (ORDER BY num) FROM foo
) AS bar WHERE id=4

سوف يختلفون عندما يكون لديك قيم متساوية في مكان ما. هناك أيضا dense_rank () إذا كنت بحاجة إلى ذلك.

هذا يتطلب postgresql 8.4، بالطبع.

نصائح أخرى

أليس كذلك:

SELECT  *
FROM    mytable
ORDER BY
        col1
OFFSET X LIMIT 1

أو أنا أفتقد شيئا؟

تحديث:

إذا كنت ترغب في إظهار الرتبة، فاستخدم هذا:

SELECT  mi.*, values[1] AS rank, values[2] AS total
FROM    (
        SELECT  (
                SELECT  ARRAY[SUM(((mi.col1, mi.ctid) < (mo.col1, mo.ctid))::INTEGER), COUNT(*)]
                FROM    mytable mi
                ) AS values
        FROM    mytable mo
        WHERE   mo.id = @myid
        ) q

ROW_NUMBER يتم تنفيذ الوظائف في postgresql عبر LIMIT n OFFSET skip.

تحرير: منذ أن تسأل عن ROW_NUMBER() بدلا من الترتيب البسيط: row_number() يتم تقديمها إلى postgresql في الإصدار 8.4. لذلك قد تفكر في التحديث. غير ذلك هذا الحل البديل قد يكون مفيدا.

الردود السابقة معالجة السؤال "حدد جميع الصفوف واحصل على رتبتهم" وهذا ليس ما تريد ...

  • لديك صف
  • تريد أن تعرف رتبتها

فقط تفعل:

حدد عدد (*) من الجدول حيث النتيجة> 1 دولار

حيث $ 1 هي درجة الصف الذي حددته للتو (أفترض أنك ترغب في عرضه حتى تتمكن من تحديد ذلك ...).

أو القيام:

حدد, ، (حدد عدد () من الجدول ب حيث النتيجة> b.score) كمرتبة من الجدول كمكان بكثير = ...

ومع ذلك، إذا قمت بتحديد صف واحد في المرتبة، نعم، ستحتاج إلى حساب جميع الصفوف التي تم تصنيفها قبل ذلك، لذلك ستحتاج إلى مسح الجدول بأكمله، وسوف يكون بطيئا للغاية.

المحلول :

حدد عدد (*) من (حدد 1 من الجدول حيث النتيجة> حد 1 $ 30)

ستحصل على تصنيف دقيق ل 30 من أفضل عشر درجات، وسوف يكون سريعا. من يهتم الخاسرين؟

حسنا، إذا كنت حقا تهتم بالخاسرين، فستحتاج إلى جعل الرسم البياني:

لنفترض أن النتيجة يمكن أن تذهب من 0 إلى 100، ولديك الخاسرون 1000000 مع النتيجة <80 و 10 الفائزون بالنتيجة> 80.

تقوم بإجراء رسم بياني لك عدد الصفوف التي تحتوي على درجة X، إنها طاولة صغيرة بسيطة مع 100 صفوف. إضافة مشغل إلى طاولتك الرئيسية لتحديث الرسم البياني.

الآن إذا كنت ترغب في تصنيف الخاسر الذي يحتوي على درجة X، رتبته مبلغ (Histo) حيث Histo_score> X.

نظرا لأن درجاتك ربما لا تتراوح بين 0 و 100، ولكن (قل) بين 0 و 1000000000، ستحتاج إلى الوعاء به قليلا، وتوسيع صناديق الرسوم البيانية الخاصة بك، على سبيل المثال. لذلك تحتاج فقط 100 صناديق كحد أقصى، أو استخدم بعض وظيفة توزيع تسجيلات تسجيل الدخول.

بالطريقة postgres هل هذا عند تحليل الجدول، لذلك إذا قمت بتعيين الإحصائيات_Target إلى 100 أو 1000 على النتيجة، تحليل، ثم تشغيل:

اشرح تحديد * من الجدول حيث النتيجة> $ 1

ستحصل على تقدير RowCount لطيفة.

من يحتاج إلى إجابات دقيقة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top