2017-08-03 7 views
9

私は約100カラムと30000行のテーブルを持っています。このような ルック何か:1つのSITE_IDの同じsector_idについてはPostgreSQLの異なる行で2つのカラムの状態が発生する

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 

、値2 < 25と同じ部門のいずれかのCELL_IDよりをvalue1> = 65「が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 
... 

私は正直、SQLにアプローチする方法がわかりません。私はWHEN CASEで試しましたが、value2の条件を記述する必要があるときに積み重ねました。

+0

お客様のサンプルデータはお客様のルールに準拠していません。 –

+0

最後の行がsector_id = 2の場合は、正しく編集しました。ありがとうございました。 – jovicbg

+0

これは助けにならないと私はそれについて残念ですが、あなたの問題は、relationnalデータベース(SQL)に合った言語でrelationnalデータベースから未対応のデータを取得しようとしていると思います...私は非常に驚くでしょう100列の関係を含むモデルは、3番目の正規形を満たしています... – 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

同一のsite_idと同じセクタIDのcell_idが同じsite_idにvalue_2 <25を持つcell_idよりもvalue_1> = 65の値を持ち、同じセクタIDが "LOW_LOAD_CELL"として分類されている場合 – jovicbg

+0

@jovicbg。 。 。セル2と12は、このルールは逆の方法であることを示しています。 –

+0

いいえ、同じsite_idの同じセクタ内に65以上のvalue1を持つセルがある場合、そのsite_idとsector_id内のvalue2が25未満のセルはすべてLOW_LOAD_CELLです。セル1と11の値1は65以上で、セル2と12の値2は25未満であるため、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 
関連する問題