【问题标题】:SQL Teradata - Comparing row values but skipping some rowsSQL Teradata - 比较行值但跳过一些行
【发布时间】:2020-02-03 18:39:44
【问题描述】:

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

#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() over 开始,并将它们与之前的排名进行比较,但我不知道如何忽略糟糕的日期。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql comparison teradata ranking


【解决方案1】:

这是一个迭代过程。您可以使用递归 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 。 . .那是一个边缘案例。我想你想要>= add_months( . . . ) 而不是>
  • 是的,想通了,现在可以完美运行了。谢谢。 (删除了之前的评论)
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多