我有一个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)值。这与当前值不同。
答案 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)