P2

问题描述 投票:0回答:1

假设我有下面的表格,他们的键只是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
sql oracle performance function analytics
1个回答
0
投票

下面是一个使用的方法 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 
© www.soinside.com 2019 - 2024. All rights reserved.