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。这是一个边缘案例。我想你想要的是
>=加上几个月(…)
而不是
。是的,我想出来了,现在它工作得很好。谢谢(删除了以前的评论)