sql - 通过与下一行比较来选择行
问题描述
我有下表,
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的行。B
caseid
所以,在上面的例子中,结果应该是:
value caseid version
----- ------ -------
4.8 2 A
5.4 2 B
我尝试过加入,但随后两行都显示在同一行中。有没有办法让值显示在不同的行上?
谢谢你。
解决方案
您可以使用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
推荐阅读
- java - 没有连接到数据库?org.hibernate.HibernateException:没有可用连接时必须设置“hibernate.dialect”
- reactjs - 我希望页面仅在验证成功时才路由到另一个页面
- python-3.x - Keras:没有为任何变量提供渐变
- perl - 在使用 perl 重命名文本文件时,问号出现在文本文件的末尾
- python - 除括号中的逗号外的所有逗号的索引
- python - 如何创建反映来自数据框的不同计算结果的多索引列
- python-3.x - Elasticsearch DSL 中的 IF 条件
- java - 将订阅的返回类型映射到其他类型
- html - 具有 100% 高度的引导块
- ios - 新时间选择器的键盘输入附件视图