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
有两行,每个版本有一行。