добавить столбец с фиксированными значениями для каждого значения другого столбца Redshift - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующая таблица

enter image description here] 1

хочу добавить диапазон дат для каждого пользователя

введите описание изображения здесь

Как этого добиться:

  1. если это возможно из запроса в Redshift, то это будет полезно

  2. Если нет, эффективный способ создать это в python pandas, поскольку данные имеют записи 8lk

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Учитывая этот фрейм данных df:

   userid username
0       1        a
1       2        b
2       3        c

, вы можете использовать numpy repeat и tile:

dr = pd.date_range('2020-01-01','2020-01-03')
df = pd.DataFrame(np.repeat(df.to_numpy(), len(dr), 0), columns=df.columns).assign(date=np.tile(dr.to_numpy(), len(df)))

Результат:

  userid username       date
0      1        a 2020-01-01
1      1        a 2020-01-02
2      1        a 2020-01-03
3      2        b 2020-01-01
4      2        b 2020-01-02
5      2        b 2020-01-03
6      3        c 2020-01-01
7      3        c 2020-01-02
8      3        c 2020-01-03
0 голосов
/ 22 июня 2020

В Sql это тоже просто - просто перекрестное соединение со списком дат, которые вы хотите добавить в каждую строку (реплицировать строки). Вы можете видеть, что в вашем примере 3 строки и 3 даты дают 9 строк. (непроверенный пояснительный код :)

select userid, username, "date" from <table> cross join (select values ('2020-01-01'::date), ('2020-02-01'::date), ('2020-03-01'::date));

Проблема с простым подходом состоит в том, что если вы имеете дело с большими таблицами и длинными списками дат, умножение вас убьет. 10 миллиардов строк на 5000 дат - это 15 триллионов результирующих строк, поэтому это займет много времени, а для их хранения потребуется много места на диске. Для небольших таблиц и коротких списков дат это отлично работает.

Если вы занимаетесь «большой» стороной вещей, вам, вероятно, придется переосмыслить то, что вы пытаетесь сделать. Поскольку вы используете Redshift, возможно, вам придется это сделать.

...