Процедура снежинки - генерировать год и месяц для каждой несводной строки

avatar
anand
2 августа 2021 в 08:58
80
1
1

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

Мне нужно сделать разворот и заполнить каждую строку скользящими окнами year_num и month_num. то есть для каждого разворота столбец «num» должен начать заполняться «num_1» из исходной таблицы вместе с (currentdate - 5 years) и заполнять соответствующие year_num и month_num как отдельные столбцы.

Итак, на текущую дату (2 августа 2021 г.) число num_1 должно быть не сведено и заполнено 08 как month_num и 2016 как year_num. Точно так же столбец num_2 той же исходной строки после разворота должен иметь 09 как month_num и 2016 как year_num в целевой строке в виде отдельной строки.

Это должно продолжаться до 12 лет с 2016 по 2028 год для столбцов до num_146.

Пример:

Исходная таблица в Snowflake содержит столбцы с именами num от num_1 до num_146

структура исходной таблицы

Я делаю разворот, используя вставку в target_table id, name, num, year, month Выберите из исходной таблицы unpivot(num for columnname in (num_1, num_2, num_3.............. ...... до num_146);

Но я не мог понять, как реализовать концепцию скользящего окна текущей даты -5 лет, чтобы вытащить месяц, год и увеличить их на следующие 12 лет, пока мы не достигнем конца каждой строки, и сделать то же самое для все без поворота.

Целевая таблица после разведения

Может ли кто-нибудь помочь мне, как добиться этого в процедуре Snowflake, основанной на javascript?

Спасибо.

Источник

Ответы (1)

avatar
Maja F.
2 августа 2021 в 12:18
1

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

При отмене сведения добавьте столбец, представляющий номер строки. Это поможет вам рассчитать смещение месяц и год спустя. Вы можете использовать функцию row_number(), чтобы получить его

row_number() over(partition by null order by null) as RN

Затем используйте этот столбец для вычисления смещения месяца и года (при условии, что current_date является начальной точкой времени)

year(add_months(current_date, RN - 61)) as year,
month(add_months(current_date, RN - 61)) as month

Вычитание 61 месяца из первой строки даст вам -60, что является месяцем и годом пятилетней давности, в результате чего получается август 2016 года. Если последняя строка равна 146, то вычитание 61 даст вам 85, что составляет 85 месяцев. будущее, в результате чего в сентябре 2028 года.

Наконец, если входными параметрами являются месяц и год (с именами p_month и p_year соответственно), вы можете заменить current_date функцией date_from_parts

year(add_months(date_from_parts(p_year, p_month, 01 ), RN - 61)) as year,
month(add_months(date_from_parts(p_year, p_month, 01 ), RN - 61)) as month
anand
3 августа 2021 в 03:10
0

Спасибо. Это помогает. row_number нужно сбрасывать для каждой 146 строки? Я пытаюсь сделать выбор вставки из.

Maja F.
3 августа 2021 в 06:20
0

Я предлагаю оператор WITH, в котором вы делаете разворот и добавляете row_number, а затем выполняете окончательный выбор для вставки из оператора WITH.