टेबल

Date    Region_1    Region_2
27-Sep  100       97.69
28-Sep  53.84   98.21
29-Sep  88.88   10
30-Sep  8.33    96
01-Oct  25     97.63
02-Oct  20     94.82
03-Oct  25     100
04-Oct  12.5    60.86
05-Oct  10      67.29
06-Oct  42.85   63.85
07-Oct  7.14    66.25
08-Oct  14.28   71.05
09-Oct  16.66   69.48
10-Oct  25      72.64
11-Oct  12.5    0

अपेक्षित उत्पादन

Region_1_Compliant_days      Region_2_compliant_Days
1                                       2

मैं प्रत्येक क्षेत्र के लिए लगातार दिन गिनने की कोशिश कर रहा हूं, जब प्रतिशत 60% से अधिक हो। लेकिन मुझे सही परिणाम नहीं मिल रहा है।

case when region_1 > 60.0 and count(date) over (partition by date desc) then 1 else 0 end

लेकिन उपरोक्त सभी मामलों की गणना 60.0 से अधिक है और न केवल लगातार दिन।

स्पष्टीकरण: 27 तारीख को क्षेत्र 1 100 है। इसलिए इसे 60 से अधिक के रूप में गिना जाता है। लेकिन 28 तारीख को यह 50 है। चूंकि यह शर्त को पूरा नहीं करता है, इसलिए मैं वहां से गिनना बंद कर दूंगा। वही क्षेत्र 2 के साथ जाता है

क्षेत्र २ में ६० से अधिक दिन हैं। लेकिन मैं केवल २ दिनों पर विचार करने का कारण यह है: २७ और २८ तारीख को मान ६० से अधिक है लेकिन २९ को यह १० है, जिसका अर्थ है कि श्रृंखला वहां टूट जाती है। इसलिए मैं केवल पहले दो दिन गिन रहा हूं.. भले ही हमारे पास २९ तारीख के बाद के बाकी दिनों के लिए ६० से अधिक दिन हैं।

कृपया मुझे बताएं कि यह कैसे हासिल किया जा सकता है।

धन्यवाद

1
Kalyan Prasad 27 सितंबर 2020, 11:24

2 जवाब

सबसे बढ़िया उत्तर

क्या आप नीचे दी गई क्वेरी के साथ प्रयास कर सकते हैं,

select sum(Region_1_Compliant_days) Region_1_Compliant_days
      ,sum(Region_2_Compliant_days) Region_2_Compliant_days
  from
(
select d.*
      ,min(case when region_1 > 60 then 1 else 0 end) over (order by dt rows between unbounded preceding and current row) Region_1_Compliant_days
      ,min(case when region_2 > 60 then 1 else 0 end) over (order by dt rows between unbounded preceding and current row) Region_2_Compliant_days
from table1 d
) t;

विंडो क्लॉज का उपयोग करते हुए हम हमेशा पिछली सभी पंक्तियों और वर्तमान पंक्ति के बीच एक विंडो की तलाश करते हैं और यदि हमें न्यूनतम 0 के रूप में मिलता है जिसका अर्थ है कि एक मान <60 है और फिर बाद में सभी के लिए 0 पर सेट है।

आशा है कि मैं समझ में आता हूं और यह अपेक्षा के अनुरूप काम करता है।

4
Sujitmohanty30 27 सितंबर 2020, 15:18

मान लें कि तिथियां लगातार हैं, आपको विंडो फ़ंक्शंस की आवश्यकता नहीं है:

select datediff(day,
                min(date),
                min(case when region_1 <= 0.6 then date end)
               ) as region_1,
       datediff(day,
                min(date),
                min(case when region_2 <= 0.6 then date end)
               ) as region_2
from t;

यह केवल डेटा में पहली तारीख और आपकी शर्त को पूरा नहीं करने वाली न्यूनतम तारीख के बीच के दिनों की संख्या देता है। मेरे लिए, यह प्रश्न का उत्तर देने का सबसे आसान तरीका प्रतीत होता है।

यदि ०.६ से कम दिन नहीं हैं, तो तर्क को थोड़ा सा मोड़ चाहिए:

select datediff(day,
                min(date),
                coalesce(min(case when region_1 <= 0.6 then date end), max(date) + interval '1 day')
               ) as region_1,
       datediff(day,
                min(date),
                coalesce(min(case when region_2 <= 0.6 then date end), max(date) + interval '1 day')
               ) as region_2
from t;
0
Gordon Linoff 27 सितंबर 2020, 16:21