كيفية حساب الرتبة المئوية نقطة مجاميع مختلفة تمتد?

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

  •  06-07-2019
  •  | 
  •  

سؤال

على PHP & CodeIgniter ويب المستندة إلى الموقع يمكن للمستخدمين كسب سمعة لمختلف الإجراءات لا تختلف عن تجاوز سعة مكدس.في كل مرة سمعة جائزة جديدة يتم إنشاء إدخال في الخلية الجدول مع user_id, العمل تكافأ و قيمة من مجموعة من النقاط (مثلا ، 10 السمعة).في نفس الوقت, حقل في users الجدول ، reputation_total, تحديث.

لأن كل هذا عبارة لا معنى لها من دون الإطار المرجعي ، أريد أن تظهر للمستخدمين الرتبة المئوية بين جميع المستخدمين.مجموع السمعة ، التي يبدو من السهل بما فيه الكفاية.دعونا نقول بلدي user_id هو 1138.الاعتماد فقط على عدد من المستخدمين في users الجدول مع reputation_total أقل من الألغام ، عد عدد من المستخدمين ، وتقسيم للعثور على نسبة المستخدمين مع انخفاض سمعة من الألغام.سيكون المستخدم 1138 هو الرتبة المئوية, صحيح ؟ من السهل!

ولكن أنا أيضا عرض سمعة مجاميع مختلفة يمتد--على سبيل المثال ، حصل في الأيام السبعة الماضية ، والذي يتضمن الاستعلام عن سمعة الجدول و تلخيص جميع النقاط المكتسبة منذ تاريخ معين.أود أيضا أن تظهر الرتبة المئوية لمختلف فترات زمنية--على سبيل المثال ، قد يكون من 11 بالمئة في العام, لكن 50% من هذا الشهر و 97 بالمائة اليوم.

يبدو أنني يجب أن تذهب من خلال العثور على سمعة المجاميع لجميع المستخدمين لمدة معينة من الزمن ، ومن ثم نرى أين كنت تقع ضمن هذه المجموعة ؟ هو أن لا بفظاعة مرهقة?ما هي أفضل طريقة للقيام بذلك ؟

شكرا جزيلا.

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

المحلول

أستطيع أن أفكر في عدد قليل من الخيارات من على قمة رأسي هنا:

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

  2. تتبع تحديثات reputation_total على أساس يومي بحيث يكون لديك جدول مع user_id, تاريخ, reputation_total.

  3. إضافة بعض أعمدة جديدة إلى الجدول المستخدم (reputation_total, reputation_total_today, reputation_total_last30days ، الخ) لكل مجموعة وقت.هل يمكن أيضا تطبيع هذا في جدول منفصل (reputation_totals) لمنع لكم من الاضطرار إلى إضافة عمود جديد في كل مرة span كنت تريد أن تتبع.

الخيار رقم 1 هو أسهل, لكنه على الارجح الى الحصول على بطء إذا كان لديك الكثير من الصفوف في سمعتك الصفقة الجدول - لن نطاق جيد جدا ، خاصة إذا كنت بحاجة إلى حساب هذه في الوقت الحقيقي.

الخيار #2 سوف تحتاج إلى مزيد من التخزين مع مرور الوقت (صف واحد لكل مستخدم في اليوم الواحد) ولكن ربما يكون أسرع بكثير من الاستعلام عن المعاملات الجدول مباشرة.

الخيار رقم 3 هو أقل مرونة ، ولكن من المرجح أن يكون الخيار الأسرع.

كلا الخيارين 2 & 3 من المرجح أن تتطلب عملية دفعة على حساب مجاميع على أساس يومي ، حتى أن تنظر إلى شيء كذلك.

أنا لا أعتقد أن أي خيار هو بالضرورة أفضل - أنها تنطوي جميعها على مختلف المفاضلات السرعة/مساحة التخزين/تعقد/المرونة.ماذا كنت تفعل في نهاية المطاف تعتمد على متطلبات التطبيق الخاص بك بالطبع.

نصائح أخرى

وأنا لا أرى لماذا يمكن أن يكون أيضا بشكل مفرط معقدة. عموما كل ما من شأنه أن عليك هو إضافة إلى جملة WHERE بك استعلام الذي يحد من نتائج مثل:

WHERE DatePosted between @StartOfRange and @EndOfRange
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top