أفضل استعلام للحصول على نسبة النجاح / الفشل من جدول حقائق المستودع

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

سؤال

أحاول تهذيب استعلام وأود بعض ردود الفعل.لدي job_fact جدول مستودع مع وحدة قياس للحدث النهائي للوظيفة (final_event_type).أحاول تشغيل استعلام عن حقيقة من شأنها أن تعطيني نسبة النجاح / الفشل.وهنا ما لدي حتى الآن:

SELECT
  CASE WHEN jf.final_event_type IN (4,6,8,9) THEN count(final_event_type) END as num_failures,
  CASE WHEN jf.final_event_type IN (5,7,10) THEN count(final_event_type) END as num_successes
FROM job_fact jf
GROUP BY jf.final_event_type;

هذا الاستعلام يعطيني فقط النجاح الخام وقيم الفشل في نتيجة صفين:

+----------------------+-----------------------+
| num_failures         | num_successes         |
+----------------------+-----------------------+
| [NULL]               | 6                     |
| 14                   | [NULL]                |
+----------------------+-----------------------+

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

أنا تشغيل كيو 9.0.1.شكرا على أي مساعدة قد تقدمها.

تحديث

استنادا إلى الإجابة المختارة (من @رونيس) ، وهنا هو بلدي الاستعلام النهائي ، في حال كنت أتساءل:

select
  sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures,
  sum(case when final_event_type in(5,7,10)  then 1 else 0 end) as successes,
count(final_event_type) as total_events,
  sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) / count(final_event_type)::decimal as failure_percentage,
  sum(case when final_event_type in(5,7,10) then 1 else 0 end) / count(final_event_type)::decimal as success_percentage
from job_fact;
هل كانت مفيدة؟

المحلول

إذا where final_event_type in(4,5,6,7,8,9,10) سوف تصل إلى معظم الجدول ، وأعتقد أن ما يلي سيكون أداء جميلة:

select sum(case when final_event_type in(4,6,8,9) then 1 else 0 end) as failures
      ,sum(case when final_event_type in(5,7,10)  then 1 else 0 end) as successes
 from job_fact;

تحرير
أنا لا أعرف كيف بوستغريسك ينفذ الاستعلام أعلاه.في أوراكل ، هناك مسار وصول يسمى مؤشر المسح الكامل السريع ، والذي يعامل أساسا الفهرس كجدول.لا اجتياز (بطيئة) ، مجرد مسح كامل (كفاءة).الفائدة هي أن مؤشر على {final_event_type} يمكن أن يكون أصغر بكثير لمسح من الجدول بأكمله.(أنا لا أذكر فهارس الصور النقطية ، لأن ذلك سيكون أسرع).

نصائح أخرى

SELECT num_failures, num_successesc, (num_failures/Total), (num_successesc/Total)
FROM (
SELECT 
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (4,6,8,9)) AS "num_failures"
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (5,7,10)) AS "num_successesc"
(SELECT COUNT(*) FROM job_fact WHERE final_event_type IN (4,6,8,9,5,7,10)) AS "Total"
) PQ
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top