根据另一列的值查询该列
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;
嗨,我有一个 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;