Как показать последнюю запись каждого клиента за каждый месяц?

#sql #teradata #teradatasql #history-tables

Вопрос:

Пожалуйста, помогите, у меня есть таблица, которая содержит историю изменений записи клиента за последние 3 года. И мне нужно вывести статус или запись каждого клиента за «последний день» «каждого» месяца.

Таблица выглядит так:

Таблица А:

 | ID  | Name | Number|from_date(in Timestamp)|to_date(in Timestamp)|
|:--- |:----:|:-----:|----------------------:|--------------------:|
|123  | John | 101   |20210101 01:11:15      |20210103 01:11:15    | 
|123  | John | 102   |20210103 01:11:15      |20210301 01:11:15    | 
|123  | John | 103   |20210301 01:11:15      |20210325 01:11:15    | 
|123  | John | 104   |20210325 01:11:15      |20210415 01:11:15    | 
|123  | John | 105   |20210415 01:11:15      |20210416 01:11:15    | 
|123  | John | 106   |20210416 01:11:15      |20210525 01:11:15    |
|123  | John | 104   |20210525 01:11:15      |20210915 01:11:15    | 
|123  | John | 105   |20210915 01:11:15      |null                 |

 

Учитывая приведенные выше данные, к сожалению, нет записей за февраль, июнь, июль, август и сентябрь
, но мне нужно показать данные клиентов в «каждом» месяце (с января по декабрь).

Ожидаемый результат должен выглядеть следующим образом:

 | ID  | Name | Number|Date    |
|123  | John | 102   |20210131|
|123  | John | 102   |20210228|
|123  | John | 104   |20210331|
|123  | John | 106   |20210430|
|123  | John | 104   |20210531|
|123  | John | 104   |20210630|
|123  | John | 104   |20210731|
|123  | John | 104   |20210831|
|123  | John | 104   |20210931|

 

Я могу получить записи за последний день всех месяцев, которые видны в from_date столбце через sql ниже.
но для месяцев, которые не перечислены, или месяцев, которые находятся между столбцом from_date и to_date , я изо всех сил пытаюсь это показать.

 select a.id, a.name, a.number, last_day(a.from_date) Date
from (select a.*, row_number() over (partition by a.id, trunc(from_date, 'MON') 
order by from_date desc) as seqnum from tableA a
 ) a where seqnum = 1;
 

для справки, приведенный выше вывод sql выглядит следующим образом:

 | ID  | Name | Number|Date    |
|123  | John | 102   |20210131|
|123  | John | 104   |20210331|
|123  | John | 106   |20210430|
|123  | John | 106   |20210531|
|123  | John | 106   |20210931|

 

Комментарии:

1. Какой у вас выпуск Teradata?

Ответ №1:

Вы можете использовать предложение Teradata «РАЗВЕРНУТЬ«. Для этого мы создаем PERIOD тип данных из вашего from_date to_date и затем используем EXPAND ON , чтобы разбить этот период на MONTH_END куски.

Это будет выглядеть примерно так:

  SELECT yourtable.*, BEGIN(bg) 
 FROM yourtable
 EXPAND ON PERIOD(from_date, NEXT(to_date)) AS by BY ANCHOR MONTH_END;
 

Возможно, вам придется немного повозиться с синтаксисом, но это должно помочь вам в этом.

Комментарии:

1. ПОДРОБНЕЕ О том, что работало на меня! Большое спасибо!

Ответ №2:

TD 16.20 поддерживает так называемую агрегацию временных рядов. Это должно вернуть ваш ожидаемый результат:

 select id, name
  ,last(number)
  ,cast(end($TD_TIMECODE_RANGE) as date)
from table1
group by time(CAL_MONTHS(1) and id, name)
         using timecode (from_date) fill (previous)
 

Комментарии:

1. Привет, это выглядит интересно! но я получаю ошибку: No supported Time Series Aggregate function specified with the GROUP BY TIME clause. вы знаете, что может быть причиной этого?

2. Трудно сказать, не зная фактического SQL. Временные ряды не поддерживают все стандартные агрегатные функции: docs.teradata.com/r/mZqhP1sCTB4T74FbSzm7vA/…

3. Я попытаюсь провести еще несколько тестов, если смогу использовать агрегацию временных рядов в своем случае. Спасибо вам за идею!

4. Здравствуйте, я искал информацию о функции агрегирования временных рядов, и, похоже, мне нужно преобразовать свою таблицу во временную таблицу, но я могу ошибаться. У вас есть пример таблицы (определение таблицы), в которой я могу использовать приведенный выше sql-код?

5. Вам не нужна таблица временных рядов, using timecode (from_date) позволяет использовать функции временных рядов.