أفضل استعلام للحصول على نسبة النجاح / الفشل من جدول حقائق المستودع
-
15-11-2019 - |
سؤال
أحاول تهذيب استعلام وأود بعض ردود الفعل.لدي 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