#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
ключевые моменты
- активен-dtmz работает только до нескольких секунд.
- игнорируйте, если следующая запись дублируется с точки зрения данных для того же ключа.
Комментарии:
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. Гордон, не могли бы вы, пожалуйста, помочь, если у вас есть какая-либо идея сделать это.