【问题标题】:Two columns condition in different rows in PostgreSQLPostgreSQL中不同行中的两列条件
【发布时间】:2017-08-03 14:49:44
【问题描述】:

我有一个大约 100 列和 30000 行的表。 看起来像这样:

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 的相同扇区 ID,如果 value1>=65,则同一扇区中 value2

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 编写条件时,我会堆叠。

【问题讨论】:

  • 您的样本数据不符合您的规则。
  • 如果是最后一行,sector_id = 2,你是对的,我已经编辑过了。谢谢。
  • 这无济于事,我很抱歉,但我认为你的问题是你试图从关系数据库中获取非关系数据,使用适合关系数据库 (SQL) 的语言......如果包含 100 列关系的模型满足第三范式,我会感到非常惊讶......
  • 我认为这是可能的,但有几个查询,很难用一个。

标签: sql postgresql


【解决方案1】:

尝试:

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

【讨论】:

    【解决方案2】:

    我认为你真正想要的逻辑是:

    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 ;
    

    这符合您的数据 - 如果扇区/站点组合的任何行的 value1 为 65 或以上,则当其 value2 小于 25 时,该单元为低负载单元。

    【讨论】:

    • 如果在同一个site_id和同一个sector_id中,任何cell_id的value_1 >= 65比在同一个site_id和同一个sector_id中具有value_2
    • @jovicbg 。 . .单元格 2 和 12 表明规则是相反的。
    • 不,如果在同一个 site_id 的同一个扇区中,任何单元格的 value1 大于 65,那么该 site_id 和扇区 ID 中 value2 小于 25 的任何单元格都是 LOW_LOAD_CELL。单元格 1 和 11 的 value1 大于 65,单元格 2 和 12 的 value2 小于 25,因此它们是 LOW_LOAD_CELL。
    【解决方案3】:

    你可以试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多