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;
假设我的 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;