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

SQL Teradata-比较行值但跳过某些行,sql,comparison,teradata,ranking,Sql,Comparison,Teradata,Ranking,假设我的表中有这些日期值: #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

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

#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号还有两个月

有没有简单、干净的方法


我从上的一个密集等级()开始,并将其与之前的等级进行比较,但我无法找出如何忽略坏日期。

这是一个迭代过程。您可以使用递归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;

用你正在使用的数据库标记你的问题。哦,哇,我不知道我可以使用CTE作为递归。我要试试。@Wildhorn。这是一个边缘案例。我想你想要的是
>=加上几个月(…)
而不是
。是的,我想出来了,现在它工作得很好。谢谢(删除了以前的评论)