根据另一列的值查询该列

Query the Column based on the value of another column

嗨,我有一个 table 这样的结构

id-rank id name  value    rank
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2
  1-3   1  abc somevalue3  3
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

这里的id-rank是id和rank的拼接。现在,如果排名大于 1(比如 2),那么我想提取 id-rank 1-1 的值列数据,即 somevalue1。

这是我写的sql

select *
case when rank > 1 then (select value where id-rank = concat(id,'-',rank-1) from table)
else ''
from table

预期输出为:

id-rank id name  value    rank new_value
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2   somevalue1  
  1-3   1  abc somevalue3  3   somevalue2  
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

我当前的输出是

id-rank id name  value    rank new_value
  1-1   1  abc somevalue1  1
  1-2   1  abc somevalue2  2   null
  1-3   1  abc somevalue3  3   null
  2-1   2  abc somevalue4  1
  3-1   3  abc somevalue5  1

但是我在 new_value 列中得到的是空值。我想这是因为它只比较相邻的列。我是 sql 的新手,如果有人对此有解决方案,请告诉我。

提前致谢

您可以使用 lag() :

select t.*, prev_val
      (case when rank > 1 then prev_val end) as new_value
from (select t.*, 
            lag(value) over (partition by id order by rank) as prev_val
      from table t
     ) t;

编辑:如果您正在寻找特定的先前值,那么只有 lag() 就足够了。

select t.*, 
       lag(value) over (partition by id order by rank) as new_value
from table t;

我会使用条件 max():

select t.*,
       max(case when rank = 1 then value end) over
           (partition by id) as new_value
from t;