2017-08-03 1 views
9

Ich habe eine Tabelle mit etwa 100 Spalten und 30000 Zeilen. in etwa so aussehen:Zwei Spalten Bedingung in verschiedenen Zeilen in 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 

Aus demselben sector_id eines site_id, wenn value1> = 65 als jede Cell_ID im selben Sektor mit value2 < 25 würde als "LOW_LOAD_CELL" eingestuft werden. gewünschte Ausgabe wäre:

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

Ich weiß nicht, wie in SQL zu nähern, ehrlich. Ich habe es mit WHEN CASE versucht, aber ich stapelte, wenn ich Bedingung für value2 schreiben musste.

+0

Ihre Beispieldaten entsprechen nicht Ihren Regeln. –

+0

Wenn es eine letzte Zeile mit sector_id = 2 war, hattest du recht, ich habe es bearbeitet. Vielen Dank. – jovicbg

+0

Das wird nicht helfen und es tut mir leid, aber ich denke Ihr Problem ist, dass Sie versuchen, unrelational Daten aus einer relationalen Datenbank mit einer Sprache zu erhalten, die relational Datenbanken (SQL) ... Ich wäre sehr überrascht, wenn Modell, das Beziehungen mit 100 Spalten enthält traf die dritte Normalform ... – Arkhena

Antwort

7

Versuch:

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

Ich denke, die Logik, die Sie eigentlich wollen, ist:

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 ; 

Dies entspricht Ihre Daten - falls vorhanden Zeile für einen Sektor/Betrieb-Kombination hat value1 von 65 oder über, dann ist diese Zelle eine niedrige Wägezelle, wenn seine value2 weniger als 25

+0

Wenn dieselbe site_id und dieselbe sector_id eine cell_id wert_1> = 65 haben als eine cell_id, die in der gleichen site_id den Wert_2 <25 hat und die gleiche sector_id als "LOW_LOAD_CELL" klassifiziert wird – jovicbg

+0

@jovicbg. . . Die Zellen 2 und 12 deuten darauf hin, dass die Regel umgekehrt ist. –

+0

Nein, wenn in demselben Sektor derselben site_id eine Zelle Wert1 über 65 hat, dann ist jede Zelle in dieser site_id und sector_id, die unter 25 Wert2 haben, LOW_LOAD_CELL. Die Zellen 1 und 11 haben den Wert 1 über 65 und die Zellen 2 und 12 den Wert 2 unter 25, also sind sie LOW_LOAD_CELL. – jovicbg

0

du versuchen:

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 
Verwandte Themen