टेबल
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 के साथ जाता है
क्षेत्र २ में ६० से अधिक दिन हैं। लेकिन मैं केवल २ दिनों पर विचार करने का कारण यह है: २७ और २८ तारीख को मान ६० से अधिक है लेकिन २९ को यह १० है, जिसका अर्थ है कि श्रृंखला वहां टूट जाती है। इसलिए मैं केवल पहले दो दिन गिन रहा हूं.. भले ही हमारे पास २९ तारीख के बाद के बाकी दिनों के लिए ६० से अधिक दिन हैं।
कृपया मुझे बताएं कि यह कैसे हासिल किया जा सकता है।
धन्यवाद
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 पर सेट है।
आशा है कि मैं समझ में आता हूं और यह अपेक्षा के अनुरूप काम करता है।
मान लें कि तिथियां लगातार हैं, आपको विंडो फ़ंक्शंस की आवश्यकता नहीं है:
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;
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।