2017-08-03 11 views
9

में विभिन्न पंक्तियों में दो कॉलम की स्थिति मेरे पास लगभग 100 कॉलम और 30000 पंक्तियों वाली एक तालिका है। इस तरह देखो कुछ:PostgreSQL

site_id cell_id sector_id value1  value2 
    1   1   1   70  23 
    1   2   1   40  20 
    1   3   1   67  35 
    1   5   2   42  60 
    1   6   2   65  30 
    1   7   2   62  62 
    2   11   1   67  11 
    2   12   1   45  22 
    2   13   1   65  15 

एक site_id का एक ही sector_id के लिए, यदि मान 1> = 65 मान 2 < 25 के साथ कि एक ही क्षेत्र में किसी भी CELL_ID से "के रूप में LOW_LOAD_CELL" वर्गीकृत किया जाएगा। वांछित उत्पादन होगा:

site_id cell_id sector_id value1  value2 cell_status 
    1   1   1   70  23  LOW_LOAD_CELL 
    1   2   1   40  20  LOW_LOAD_CELL 
    1   3   1   67  35 
    1   5   2   42  60 
    1   6   2   65  30 
    1   7   2   62  62 
    2   11   1   67  11  LOW_LOAD_CELL 
    2   12   1   45  22  LOW_LOAD_CELL 
    2   13   1   65  15  LOW_LOAD_CELL 
... 

मैं कैसे एसक्यूएल में दृष्टिकोण, ईमानदारी से पता नहीं है। मैंने WHEN मामले के साथ प्रयास किया है, लेकिन जब मुझे मूल्य 2 के लिए स्थिति लिखने की आवश्यकता होती है तो मुझे ढेर लगाया जाता है।

+0

आपका नमूना डेटा आपके नियमों के अनुरूप नहीं है। –

+0

यदि यह sector_id = 2 के साथ अंतिम पंक्ति थी, तो आप सही थे, मैंने संपादित किया है। धन्यवाद। – jovicbg

+0

इससे मदद नहीं मिलेगी और मुझे इसके बारे में खेद है, लेकिन मुझे लगता है कि आपकी समस्या एक संबंधपरक डेटाबेस से संबंधपरक डेटाबेस प्राप्त करने की कोशिश कर रही है जो एक भाषा के साथ संबंधपरक डेटाबेस (एसक्यूएल) फिट है ... मुझे आश्चर्य होगा अगर मॉडल जिसमें 100 कॉलम के साथ संबंध शामिल हैं, तीसरे सामान्य रूप से मिले ... – Arkhena

उत्तर

7

कोशिश:

select * 
, case when value1>=65 and min(value2) over (partition by site_id, sector_id)<25 then 'LOW_LOAD_CELL' end cell_status 
from your_table 
7

मुझे लगता है कि आप वास्तव में तर्क चाहते हैं:

select t.*, 
     (case when max(value1) over (partition by site_it, sector_id) >= 65 and 
        value2 < 25 
      then 'LOW_LOAD_CELL' 
     end) as cell_status 
from t ; 

यह आपके डेटा के अनुरूप है - एक क्षेत्र/साइट संयोजन के लिए किसी भी पंक्ति है अगर 65 की value1 या ओवर, तब वह सेल एक कम लोड सेल है जब इसकी value2 25 से कम है।

+0

यदि एक ही साइट_आईडी और एक ही सेक्टर_आईडी में किसी सेल_आईडी में वैल्यू_1> = 65 है जो किसी भी सेल_आईडी की तुलना में वैल्यू_2 <25 है, उसी साइट_आईडी में 25% और उसी सेक्टर_आईडी को "LOW_LOAD_CELL" – jovicbg

+0

@jovicbg के रूप में वर्गीकृत किया गया है। । । कोशिकाएं 2 और 12 बताती हैं कि नियम दूसरी तरफ है। –

+0

नहीं, यदि उसी साइट_आईडी के उसी क्षेत्र में किसी भी सेल के 65 से अधिक मान 1 है, तो उस साइट_आईडी और सेक्टर_आईडी में से कोई भी सेल जिसमें 25 से कम मान 2 है LOW_LOAD_CELL है। कक्ष 1 और 11 में 65 से अधिक मान 1 है, और 25 के तहत कक्ष 2 और 12 मान 2 है, इसलिए वे LOW_LOAD_CELL हैं। – jovicbg

0

आप इसे आजमा सकते हैं:

select t.*, case when t2.cnt > 0 and value2 < 25 then 'LOW_LOAD_CELL' end cell_status 
from mytable as t left join 
(select site_id, sector_id, count(*) cnt from mytable where 
    value1 >= 65 group by site_id, sector_id) as t2 
on t.site_id = t2.site_id and t.sector_id = t2.sector_id