Table:
x
Col1 Col2 Col3
43 1234 abc
42 1234 abc
41 1234 abc
35 1234 abc
34 5678 def
Objective is to create a new column Col4
as 1 or 0 based on following:
Within each partition by with Col2 and Col3
,
either
- if Col1-1 does not exists (or)
- if Col1-1 (and) Col1-2 both values exists in table,
then Col4 is 1, else 0.
Output Table:
Col1 Col2 Col3 Col4
43 1234 abc 1
42 1234 abc 0
41 1234 abc 1
35 1234 abc 1
34 5678 def 1
Advertisement
Answer
If I am following the logic you describe:
select t.*,
(case when lag(col1) over (partition by col2, col3 order by col1) <> col1 - 1
then 1
when lag(col1) over (partition by col2, col3 order by col1) is null
then 1
when lag(col1, 2) over (partition by col2, col3 order by col1) = col1 - 2
then 1
else 0
end) as col4
from t;
Here is a db<>fiddle.