2017-08-03 73 views
9

Mam tabelę zawierającą około 100 kolumn i 30000 wierszy. wyglądać tak:Stan dwóch kolumn w różnych wierszach w 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 

Z tego samego sector_id jednego site_id, jeśli wartość1> = 65 niż jakikolwiek CELL_ID w tej samej branży z wartość2 < 25 byłyby klasyfikowane jako „LOW_LOAD_CELL”. Pożądany wynik byłby:

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

nie wiem jak podejść w SQL, uczciwie. Próbowałem z WHEN CASE, ale ułożyłem się, gdy potrzebowałem napisać warunek dla value2.

+0

Twoje przykładowe dane nie są zgodne z Twoimi zasadami. –

+0

Jeśli był to ostatni wiersz z sector_id = 2, miałeś rację, edytowałem. Dziękuję Ci. – jovicbg

+0

To nie pomoże i jest mi przykro z tego powodu, ale myślę, że twoim problemem jest twoja próba uzyskania unrelationnal danych z relacyjnej bazy danych z językiem, który pasuje do relacyjnych baz danych (SQL) ... Byłbym bardzo zaskoczony, gdyby model, który zawiera relacje ze 100 kolumnami, spotkał się z trzecią normalną formą ... – Arkhena

Odpowiedz

7

try:

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

myślę logika rzeczywiście chcesz to:

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 ; 

jest zgodny z Państwa danych - jeśli każdy wiersz dla kombinacji sektor/strona ma value1 z 65 lub ponad, to ta komórka jest komórką o niskim obciążeniu, gdy jej value2 jest mniejsza niż 25.

+0

Jeśli w jednym identyfikatorze site_id i tym samym jeden sector_id, wartość cell_id ma wartość_1> = 65 niż jakikolwiek identyfikator cell_id, który ma wartość_2 <25 w tym samym id_witryny i ten sam identyfikator sektora jest klasyfikowany jako "LOW_LOAD_CELL" – jovicbg

+0

@jovicbg. . . Komórki 2 i 12 sugerują, że reguła jest odwrotna. –

+0

Nie, jeśli w tym samym sektorze tego samego id_strony każda komórka ma wartość1 powyżej 65, to każda komórka w tym id_strony i id_ sektora, które mają wartość2 poniżej 25, to LOW_LOAD_CELL. Komórki 1 i 11 mają wartość1 powyżej 65, a komórki 2 i 12 wartość 2 poniżej 25, więc są to LOW_LOAD_CELL. – jovicbg

0

Możesz spróbować:

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