как реализовать SCD типа 2 в красном смещении

#sql #stored-procedures #amazon-redshift

Вопрос:

мы получаем данные , как показано ниже, столбец времени создания указывает нам порядок записей. необходимо обработать полный пакет записей. после обработки необходимо поддерживать SCD типа -2. и поддерживать активные и неактивные столбцы.

 key data    creation_time (in mili seconds)
k1  abc     2021-09-16 14:17:28.447000
k1  abcd    2021-09-16 18:50:42.676000
k1  abc     2021-09-16 18:50:42.853000
k1  abcd    2021-09-16 18:50:43.141000
k1  abc     2021-09-16 18:50:43.809000
k1  abcd    2021-09-16 18:50:44.288000
k1  abc     2021-09-16 18:50:44.854000
 

вывод после применения SCD типа-2.

Правило№. порядок входящих данных основан на creation_time, новая запись будет вставлена и деактивирована только в том случае, если данные входящей записи претерпели некоторые изменения, а ее значение active_dtmz (до секунд) является инкрементным значением.

 key data    active_dtmz             inactive_dtmz
k1  abc     2021-09-16 14:17:28     2021-09-16 18:50:42
k1  abcd    2021-09-16 18:50:42     2021-09-16 18:50:43
k1  abc     2021-09-16 18:50:43     2021-09-16 18:50:44
k1  abcd    2021-09-16 18:50:44     3001-01-01 00:00:00
 

ключевые моменты

  1. активен-dtmz работает только до нескольких секунд.
  2. игнорируйте, если следующая запись дублируется с точки зрения данных для того же ключа.

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

1. Почему в результирующем наборе всего 4 строки?

2. значения active_dtmz не содержат миллисекунд, поэтому существует только 4 записи. это требование, чтобы active_dtmz содержал только секунды.

3. . . Вопрос необходимо изменить (или вам нужно задать новый вопрос), чтобы четко объяснить логику. «только до нескольких секунд» не работает. Как вы обрабатываете несколько строк с одинаковым значением секунд?

4. конечно , я добавил еще несколько деталей, как правило, пожалуйста, дайте мне знать, если у вас все еще есть какие-либо вопросы. мне нужно понять, возможно это или нет. спасибо, что уделили мне время.

Ответ №1:

Основываясь на вашем описании, вы, кажется, хотите lead() :

 select t.key, t.data, t.creation_time as active_dtmz,
       lead(t.creation_time, 1, '3000-01-01 00:00:00') over (partition by t.key order by t.creation_time) as inactive_dtmz
from t;
 

Однако остается загадкой, почему ваши желаемые результаты имеют только четыре строки.

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

1. на самом деле вы учли, что у active_dtmz также есть миллисекунды, но это НЕ относится к ожидаемому выходу, поэтому у него меньше строк. единственная проблема здесь active_dtmz заключается в том, что у вас всего несколько секунд. вот почему это усложняет эту проблему.

2. Гордон, не могли бы вы, пожалуйста, помочь, если у вас есть какая-либо идея сделать это.