SQL Teradata - сравнивает значения строк, но пропускает некоторые строки - PullRequest
0 голосов
/ 03 февраля 2020

Допустим, у меня есть следующие значения дат в моей таблице:

#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, который был последним хорошим.

Есть ли простой, чистый способ сделать это?

Я начал с dens_rank () более и сравнить их с предыдущим рейтингом, но я не могу понять, как игнорировать плохие даты.

1 Ответ

1 голос
/ 03 февраля 2020

Это итеративный процесс. Вы можете решить это с помощью рекурсивного CTE. Учитывая, что вы имеете дело с датами и месяцами, ваши данные не слишком велики, поэтому это может быть разумным решением.

Арифметика даты c значительно различается в разных базах данных. Вот идея:

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;
...