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

SQL Teradata - Comparing row values but skipping some rows

假设我的 table:

中有这些日期值
#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

我只需要保留与前一个 "good" 相隔 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;