【问题标题】:Select rows by comparing with next row通过与下一行比较来选择行
【发布时间】:2019-10-17 07:48:53
【问题描述】:

我有下表,

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 in rows with version A and those in version B with the same caseid, 并且只显示差异大于 0.1 的行。

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

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

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

谢谢。

【问题讨论】:

  • 谢谢巴特莱特。每个version 的每个caseid 是否总是只有一个value?例如,如果有两个 values 对应于 caseid=1:一个在示例中的 2.6,而另一个在 2.1,您想查看什么?
  • @alexgibbs,在这种情况下,每个caseid 会有两行,每个version 有一行。

标签: sql oracle


【解决方案1】:

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

db小提琴here

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2014-05-15
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多