Sql 通过与下一行比较来选择行

Sql 通过与下一行比较来选择行,sql,oracle,Sql,Oracle,我有下表 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 我想将版本为A的行中的值与版本为B的行中的值进行比较,并且只显示差异大于0.1的行 因此,在上述示例中,结果应为: value caseid

我有下表

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
我想将版本为
A
的行中的
值与版本为
B
的行中的
值进行比较,并且只显示差异大于0.1的行

因此,在上述示例中,结果应为:

value   caseid    version
-----   ------    -------
4.8     2         A
5.4     2         B
我尝试使用联接,但两行都显示在同一行中。 有没有一种方法可以在不同的行上显示值


谢谢。

您可以使用
union all


with tab as(
select 2.6 as value,     1  as caseid,       'A' as version 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 
)

select t1.value, t1.caseid, t1.version
  from tab t1
  join tab t2 on t1.caseid = t2.caseid
  where (t1.value- t2.value) > 0.1
union all
select t2.value, t2.caseid, t2.version
  from tab t1
  join tab t2 on t1.caseid = t2.caseid
  where (t1.value- t2.value) > 0.1
dbfiddle

您可以使用
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

谢谢你,巴特利特。是否每个
版本的每个
案例ID总是只有一个
?例如,如果
caseid
=1有两个
value
s,您希望看到什么:一个在示例中为2.6,另一个在2.1?@alexgibbs,在这种情况下,每个
caseid
有两行,每个
版本有一行。