2013-09-21 4 views
5

मैं Oracle जो उड़ान के चालक दल के लिए प्रति माह रात भर रहता है की संख्या (यदि हो तो) रिटर्न में कुछ चुने हुए बनाया:समूह 3 महीने से अवधि

CRE_ALPHA CRE_NAME MONTH YEAR NIGHT_STOPS 
---------- --------- ------ ----- ------------ 
AAC  Adinda 6  2013 8 
AAC  Adinda 7  2013 9 
AAC  Adinda 8  2013 2 
AAC  Adinda 9  2013 7 
AAC  Adinda 10  2013 4 
CCU  Cristiano 6  2013 5 
CCU  Cristiano 7  2013 6 
CCU  Cristiano 8  2013 3 
CCU  Cristiano 9  2013 11 
CVA  Carine 7  2013 9 
CVA  Carine 9  2013 10 
CVA  Carine 10  2013 10 

अब, वहाँ 18 रात की एक सीमा पर बंद हो जाता है एक 3 महीने का आधार। इसलिए मैं किसी भी 3 सफल महीनों से समूह करना चाहता हूं जिसमें 18 रात की रुकें हैं। परिणाम कुछ इस तरह होना चाहिए:

CRE_ALPHA CRE_NAME TIMESPAN  NIGHT_STOPS 
---------- --------- --------------- ------------ 
AAC  Adinda 6/2013-8/2013 19 
AAC  Adinda 7/2013-9/2013 18 
CCU  Cristiano 7/2013-9/2013 20 
CVA  Carine 7/2013-9/2013 19 
CVA  Carine 8/2013-10/2013 20 

नोट अगर वहाँ शून्य रात एक महीने के लिए बंद हो जाता है कर रहे हैं, वहाँ कोई पंक्ति है, लेकिन मैं 0.

साथ एक सहित 3 महीने के लिए एक परिणाम चाहते हैं कि

क्या कोई मदद कर सकता है?

यह मदद कर सकते हैं, पूर्ण नीचे का चयन करें:


ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY hh24:mi:ss'; 
SELECT cre_id, cre_alpha, cre_first_name, cre_last_name, Maand, Jaar, count(*) "Night stops" 
FROM 
    (SELECT cre_id, cre_alpha, cre_first_name, cre_last_name, pos_crb_iata_code, dst, det, dsa, (dst - Prev_end_time) * 1440 stop_over, EXTRACT(MONTH FROM dst) Maand, EXTRACT(YEAR FROM dst) Jaar 
    FROM 
    (SELECT cre_id, cre_alpha, cre_first_name, cre_last_name, pos_crb_iata_code, dst, dsa, det, dea, LAG(det) OVER (ORDER BY cre_alpha, dst) Prev_end_time 
    FROM 
     (SELECT cre_id, cre_alpha, cre_first_name, cre_last_name, pos_crb_iata_code, 
     COALESCE(flt_mvt_db, flt_com_dep_blk, pog_std, gco_start, oth_std, rsv_std) as dst, 
     COALESCE(flt_mvt_ab, flt_com_arr_blk, pog_sta, gco_end, oth_sta, rsv_sta) as det, 
     COALESCE(flt_apt_iata_code_dep, pog_apt_iata_code_from, gco_apt_iata_code, rsv_apt_iata_code) as dsa, 
     COALESCE(flt_apt_iata_code_arr, pog_apt_iata_code_to, gco_apt_iata_code, rsv_apt_iata_code) as dea 
     FROM 
     (SELECT DISTINCT cre_id, cre_alpha, cre_first_name, cre_last_name, pos_crb_iata_code 
     FROM master.crews, master.assignments, master.positions 
     WHERE asg_pos_id = pos_id AND asg_cre_id = cre_id AND asg_d_type <> 'LEA' 
     AND asg_start_time BETWEEN '01-JUN-2013' AND '01-NOV-2013' 
     ORDER BY cre_alpha) tab1, master.assignments 
     FULL OUTER JOIN master.flights ON master.assignments.asg_flt_id = master.flights.flt_id 
     FULL OUTER JOIN master.positionings ON master.assignments.asg_pog_id = master.positionings.pog_id 
     FULL OUTER JOIN master.ground_courses ON master.assignments.asg_gco_id = master.ground_courses.gco_id 
     FULL OUTER JOIN master.other_duties ON master.assignments.asg_oth_id = master.other_duties.oth_id 
     FULL OUTER JOIN master.reserves ON master.assignments.asg_rsv_id = master.reserves.rsv_id 
     WHERE asg_d_type <> 'LEA' AND asg_d_type <> 'STP' AND asg_cre_id = tab1.cre_id 
     AND asg_start_time BETWEEN '01-JUN-2013' AND '02-NOV-2013' AND asg_actif = 'Y' 
     ORDER BY cre_alpha, asg_start_time) 
    ) 
    WHERE pos_crb_iata_code <> dsa 
    AND EXTRACT(DAY FROM dst) - EXTRACT(DAY FROM Prev_end_time) >= 1) 
WHERE stop_over > 240 
GROUP BY cre_id, cre_alpha, cre_first_name, cre_last_name, Maand, Jaar 
ORDER BY cre_alpha; 

उत्तर

3

आप प्राप्त करने के लिए आप क्या चाहते हैं विश्लेषणात्मक कार्यों का उपयोग कर सकते हैं। अपने वर्तमान क्वेरी के शीर्ष पर बिल्डिंग, यह इस प्रकार है:

select * 
from (
    select cre_alpha, cre_name, 
    month month_end, year year_end, 
    sum(night_stops) over (
     partition by cre_alpha, cre_name 
     order by year * 12 + month 
     range between 2 preceding and current row 
    ) as night_stops 
    from (
     ... your current query ... 
    ) t 
) m 
where night_stops >= 18 

नोट:

  • क्वेरी 3 महीने की अवधि के अंत में (वर्ष/माह) देता है। आपको अवधि की शुरुआत को प्रिंट करने के लिए इसे विस्तारित करना होगा।
  • मैंने आपके आउटपुट से मेल खाने के लिए >= 18 स्थिति का उपयोग किया है, भले ही पाठ कहता है कि यह > 18 है।
  • विंडो range between 2 preceding and current row क्लॉज year * 12 + month के आदेश के साथ एक साथ तीन महीने की खिड़की ली जाती है और न केवल तीन पंक्तियां होती हैं। यह प्रासंगिक है यदि आपके पास आपकी मूल क्वेरी में महीना गुम है।

मज़े करें।

+0

'वर्ष * 12 + महीने' द्वारा ऑर्डरिंग 'महीने' के आदेश से अलग कैसे है? 'सुनिश्चित करें कि एक तीन महीने की खिड़की ली जाती है और न केवल तीन पंक्तियां' कैसे आती हैं? –

+0

यदि सभी पंक्तियां उसी वर्ष से हैं, तो आप 'वर्ष * 12 + महीने' के बजाय केवल 'माह' का उपयोग कर सकते हैं। लेकिन अगर वे अलग-अलग वर्षों से हैं, तो यह महत्वपूर्ण है कि उदा। दिसंबर 2012 और जनवरी 2013 को निरंतर संख्या सौंपा गया है ताकि आप विंडोिंग क्लॉज को सही तरीके से लागू कर सकें। – Codo

+0

आह! फिर यह समझ में आता है। –

संबंधित मुद्दे