GOOGLE ADS

суббота, 9 апреля 2022 г.

Получить максимальную дату из столбцов в Redshift, используя динамически меняющийся список столбцов и таблиц с Python?

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

table_name column data_type
tbl1 sent_at timestamp without timezone
tbl1 message_received timestamp without timezone
tbl1 scene_updated timestamp without timezone
tbl2 phone_updated timestamp without timezone
tbl2 col2_updated timestamp without timezone
tbl3 sent_at timestamp without timezone
tbl3 number_updated timestamp without timezone

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

for table in set(df.table_name):
sub = df[df.table_name == table]
cols = [x for x in sub.column.values.tolist()]
str_max = 'max()' * len(cols)
que = 'select' + str_max + 'from {}'.format(table)
time_table = pd.read_sql_query(que, conn)
....


Затем я бы использовал pandas, чтобы получить максимальное значение всех столбцов. Однако я не могу понять, как вставить имя столбца между «()», чтобы получить максимальное значение при изменении всех имен столбцов. Возможно, в Redshift есть способ посмотреть максимальное значение всех столбцов при использовании фильтра data_type, но я не знаю, как это сделать.


Решение проблемы

Я решил это, используя другой цикл for и добавив имена столбцов в строку. Затем я объединил список в одну строку, чтобы поместить ее в один запрос. После выполнения запроса я использовал max(), чтобы найти максимальное значение всех столбцов.

for table in set(df.table_name):
sub = created_at_tables[created_at_tables.table_name == table]
cols = [x for x in sub.column_name.values.tolist() if x!= 'table_updated_at']
col_str = []
for i in cols:
col_str.append('max(' + i + ') as ' + i)
col_str = ','.join(col_str)
que = 'select {} from schema.{}'.format(col_str, table)
new_table = pd.read_sql_query(que, rsm.dbengine)
new_table.dropna(axis = 1, inplace = True)
most_recent_date = new_table.max(axis=1).reset_index()[0][0]

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...