【问题标题】:Compare previous revisions of a column比较列的先前版本
【发布时间】:2019-11-28 01:43:10
【问题描述】:

我需要确定以下每个项目的不同修订版的差异,我如何比较同一列中的数据 - 基于旧修订版的值?

T1:
ID    Value   Rev    
1     1001     01    
1     1002     02    
1     1001     03    
1     1002     03    
2     1003     02    
2     1004     03    
3     1003     01    
3     1005     02    
3     1005     03  
4     1002     01

对于 #1:Rev 1 - 1001、Rev 2- 1002、Rev 3 - 1001 和 1002
对于 #2:Rev 2 - 1003、Rev 3 - 1004
对于 #3:Rev 1 - 1003,Rev 2:1005

期望的输出:

ID    Value    Rev
1     1001     01         
1     1002     02        
1     1001     03         
1     1002     03         
2     1003     02         
2     1004     03         
3     1003     01          
3     1005     02

【问题讨论】:

标签: sql oracle


【解决方案1】:

我认为您想要的 id 不止一行。如果是这样:

select t.*
from (select t.*, count(*) over (partition by id) as cnt
      from t
     ) t
where cnt > 1
order by id, rev;

或者使用exists:

select t.*
from t
where exists (select 1
              from t tt
              where tt.id = t.id and
                    (tt.value <> t.value or
                     tt.rev <> t.rev
                    )
             )
order by id, rev;

【讨论】:

  • 不,实际上我想比较每个我想要的修订并确定更改。例如-#1 在第一版中有 1001,在第二版中有 1002,在第三版中有 1001 和 1002。
【解决方案2】:

您可以简单地执行self-join 并使用Distinct 来实现如下结果:

SELECT DISTINCT T11.ID, T11.VALUE, T11.rev FROM 
T1 T11 
JOIN T1 T12 
ON (T11.ID = T12.ID AND T11.VALUE <> T12.VALUE)
ORDER BY T11.ID, T11.rev

db<>fiddle demo

干杯!!

【讨论】:

    【解决方案3】:

    你可以尝试使用 lag() 和 lead()

    DEMO

    select id, value, rev from 
    (
    select * , lead(value) over(partition by id order by rev) as val1,
    lag(value) over(partition by id order by rev) as val2
    from t1
    )A 
    where (value<>val2 or value<>val1)
    

    输出:

    id  value   rev
    1   1001    01
    1   1002    02
    1   1001    03
    1   1002    03
    2   1003    02
    2   1004    03
    3   1003    01
    3   1005    02
    

    【讨论】:

    • 谢谢!如何仅识别发生更改的修订版?这似乎返回了旧版本和新版本。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多