查询以获取以前的值

时间:2015-06-26 02:48:53

标签: sql oracle

我有一个scenerio,我需要以前的列值,但它不应该与当前列值相同。

表A:

+------+------+-------------+
| Col1 | Col2 |   Lead_Col2 |
+------+------+-------------+
|    1 | A    | NULL        |
|    2 | B    | A           |
|    3 | B    | A           |
|    4 | C    | B           |
|    5 | C    | B           |
|    6 | C    | B           |
|    7 | D    | C           |
+------+------+-------------+

如上所述,我需要previuos列(Col2)值。这与当前值不同。

3 个答案:

答案 0 :(得分:1)

尝试:

select *
  from (select col1,
               col2,
               lag(col2, 1) over(order by col1) as prev_col2
          from table_a)
 where col2 <> prev_col2

答案 1 :(得分:0)

名称lead_col2具有误导性,因为您确实需要延迟。

这是一个强力方法,它使用相关子查询来获取值的索引,然后将值加入:

select aa.col1, aa.col2, aa.col2
from (select col1, col2,
             (select max(col1) as maxcol1
              from a a2
              where a2.id < a.id and a2.col2 <> a.col2
             ) as prev_col1
      from a
     ) aa left join
     a
     on aa.maxcol1 = a.col1

编辑:

您还可以使用lead()的逻辑并忽略NULL s。如果值是序列中的最后一个,则使用该值,否则将其设置为NULL。然后将lag()ignore NULL`s:

一起使用
select col1, col2,
       lag(col3) over (order by col1 ignore nulls)
from (select col1, col2,
             (case when col2 <> lead(col2) over (order by col1) then col2
              end) as col3
      from a
     ) a;

答案 2 :(得分:0)

试试这个:

%x

SQL Fiddle