嗨,我有一个这样的表结构
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等级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列中的null。我猜这是因为它仅比较相邻列。我是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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句