2017-08-03 105 views
9

Yaklaşık 100 sütun ve 30000 satır içeren bir tablom var. Böyle Bak bir şey: Bir SITE_ID aynı sector_id içinFarklı satırlarda iki sütun durumu 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 

, değer2 < 25 ile aynı sektörde herhangi KİM daha deger1> = 65 "LOW_LOAD_CELL" olarak sınıflandırılabilir olsaydı. İstenilen çıkış olacaktır:

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 
... 

Dürüst, SQL yaklaşım nasıl bilmiyorum. WHEN CASE ile denedim, ancak değer2 için koşul yazmam gerektiğinde yığıldı.

+0

Örnek verileriniz, kurallarınıza uygun değil. –

+0

sector_id = 2 ile son bir satır olsaydınız haklıydınız, düzenledim. Teşekkür ederim. – jovicbg

+0

Bu yardımcı olmayacaktır ve bunun için üzgünüm, ama senin sorununun ilişkisel veritabanları (SQL) ile eşleşen bir dille ilişkisel bir veriden ilişkisel veri elde etmeye çalıştığını düşünüyorum. 100 sütun ile ilişkileri içeren model üçüncü normal formu karşıladı ... – Arkhena

cevap

7

deneyin:

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

Ben aslında istediğiniz mantık olduğunu düşünüyorum:

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 ; 

Bu verilere uygun - bir sektör/sitesi kombinasyonu için herhangi bir satır varsa 65 value1 veya üzerinde, o hücrenin kendi value2 25'den az

+0

Aynı sektörde bir site_id ve aynı bir sektör_kimliği varsa, herhangi bir cell_id öğesi, aynı site_id değerinde_2 <25 değerine sahip olan ve aynı "sektör_id" değerine sahip olan herhangi bir cell_id değerinden daha büyükse_1> = 65 değerine sahiptir: "LOW_LOAD_CELL" – jovicbg

+0

@jovicbg. . . Hücreler 2 ve 12, kuralın başka bir yol olduğunu gösterir. –

+0

Hayır, aynı site_id'in aynı sektörde, herhangi bir hücrenin 65'in üzerinde bir değere sahip olması durumunda, o site_id ve 25'in altında2 değerine sahip olan sektör_idindeki herhangi bir hücre LOW_LOAD_CELL'dir. Hücreler 1 ve 11, 65'in üzerinde bir değere ve 25'in altındaki 2 ve 12 değer2 değerine sahiptir, bu nedenle LOW_LOAD_CELL'dir. – jovicbg

0

Bu deneyebilirsiniz olduğu düşük bir yük hücresidir:

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