假设我有下面的表格,他们的键只是concat P1, P2, P3。他们的键是P1, P2, P3。例如,从第1天到第2天,删除abc,增加abe,aby。
P1 P2 P3 DAY KEY
a b c 1 abc
a b e 2 abe
a b y 2 aby
a b x 3 abx
a b c 3 abc
预期的结果集。
KEY OPERATION DAY
abc ADD 1
abe ADD 2
aby ADD 2
abc REMOVE 2
abx ADD 3
abc ADD 3
abe REMOVE 3
aby REMOVE 3
如果一天不按顺序排列呢?比如说。
P1 P2 P3 DAY KEY
a b c 1 abc
a b e 2 abe
a b y 2 aby
a b x 5 abx
a b c 5 abc
预期结果是:
KEY OPERATION DAY
abc ADD 1
abe ADD 2
aby ADD 2
abc REMOVE 2
abx ADD 5
abc ADD 5
abe REMOVE 5
aby REMOVE 5
下面是一个使用的方法 lag()
和 lead()
. 我们的想法是比较每个键的前一个和后一个日期值,然后用它来确定键被添加或删除的日期--这假定了 day
是一个按顺序递增的数字,没有间隙。
with cte as (
select
t.*,
lag(day) over(partition by p1, p2, p3 order by day) lag_day,
lead(day) over(partition by p1, p2, p3 order by day) lead_day
from mytable t
)
select p1, p2, p3, day, 'add' event
from cte
where lag_day is null or lag_day <> day - 1
union all
select p1, p2, p3, day + 1, 'remove'
from cte
where lead_day is null or lead_day <> day + 1
order by day, p1, p2, p3
您的样本数据在 这把琴,从而产生。
P1