假设我有下表。它们的关键是连接p1,p2,p3。我想比较一下每一天的钥匙。例如,从第1天到第2天,删除,添加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
2条答案
按热度按时间relj7zay1#
下面是一种使用
lag()
以及lead()
. 其思想是比较每个键的上一个和下一个日期值,并使用该值来标识添加或删除键的日期—这假设day
是一个连续递增的数字,没有间隔。使用此db小提琴中的示例数据,将生成:
这似乎比你预期的结果更完整。请注意,在最后一天仍然可用的所有记录在下一天(假设)显示为已删除-这似乎与所有新记录在第一天显示为已添加的事实一致。
我没有使用伪键,因为它看不出它有什么帮助——而且,如果值有多个字符,它可能会通过创建“假”副本而带来麻烦。
5rgfhyps2#
如果需要,可以在不使用窗口函数的情况下执行此操作: