SQL Teradata - 比较行值但跳过某些行



假设我的表中有这些日期值:

#1 2019-01-01
#2 2019-02-01
#3 2019-03-01
#4 2019-05-01
#5 2019-06-01
#6 2019-06-15
#7 2019-07-01

我只需要保留与上一个"好"日期相差 2 个月的日期。

所以,我从:

#1 是第一个,我把它作为一个好的

。#2只有一个月的公寓,所以不好。

#3 是从 #1 分配的两个月(我忽略 #2,因为它不好(。

#4 是 #3 的两个月,所以我保留它

#5不好,因为它距离#4只有一个月

#6 不好,因为它距离 #4 只有一个半月(#5 被忽略,因为它不好(。

#7 很好,因为它与 #4 相差两个月,这是最后一个好的。

有没有一种简单、干净的方法可以做到这一点?

我从dense_rank((开始,将它们与之前的排名进行比较,但我无法弄清楚如何忽略糟糕的日期。

这是一个迭代过程。 您可以使用递归 CTE 来解决它。 鉴于您正在处理日期和月份,您的数据不会太大,因此这可能是一个合理的解决方案。

不同数据库的日期算术差异很大。 以下是想法:

with recursive t as (
select t.*, row_number() over (order by datecol) as seqnum
from mytable t
) t,
cte as (
select datecol, seqnum, datecol as refdate
from t
where seqnum = 1
union all
select t.datecol, t.segnum,
(case when t.datecol >= add_months(cte.refdate, 2)
then t.datecol else cte.refdate
end)
from cte join
t
on t.seqnum = cte.seqnum + 1
)
select distinct refdate
from cte;

最新更新