首页 > 解决方案 > 通过与下一行比较来选择行

问题描述

我有下表,

value   caseid    version
-----   ------    -------
2.6     1         A
2.7     1         B
4.8     2         A
5.4     2         B
2.9     3         A
3.0     3         B

我想将value带有版本的行与带有相同A版本的行进行比较,并且只显示差异大于0.1的行。Bcaseid

所以,在上面的例子中,结果应该是:

value   caseid    version
-----   ------    -------
4.8     2         A
5.4     2         B

我尝试过加入,但随后两行都显示在同一行中。有没有办法让值显示在不同的行上?

谢谢你。

标签: sqloracle

解决方案


您可以使用lag()窗口分析功能:

with t1( value, caseid, version ) as
(
 select 2.6, 1, 'A' from dual union all
 select 2.7, 1, 'B' from dual union all
 select 4.8, 2, 'A' from dual union all
 select 5.4, 2, 'B' from dual union all
 select 2.9, 3, 'A' from dual union all
 select 3.0, 3, 'B' from dual 
), t2 as
(
select t1.value - lag(t1.value,1,t1.value) over 
       (partition by t1.caseid order by t1.version ) as diff,
       t1.* 
  from t1
)
select value, caseid, version
  from t2
 where t2.caseid in ( select caseid 
                        from t2 
                       where caseid = t2.caseid 
                         and diff > .1 )
 order by version;

VALUE   CASEID  VERSION
-----   ------  -------
4,80    2       A
5,40    2       B

Demo


推荐阅读