SQL применить предложение where к результатам произвольного запроса

#python #sql #pandas #sqlalchemy

#python #sql #pandas #sqlalchemy

Вопрос:

Я работаю над системой, в которой пользователь вводит соединение SQL server / db и действительный SQL-запрос, который я сохраняю в своей системе. Для этого я использую python sqlalchemy pandas.

Этот запрос вернет таблицу, подобную этой, в которой единственным правилом является то, что результат запроса должен иметь timestamp поле as DateTime и, по крайней мере, еще один столбец с числовыми значениями, но случайным именем.

  ----------- ---------- --------- ----- --------- 
| timestamp | series_1 | serie_2 | ... | serie_n |
 ----------- ---------- --------- ----- --------- 
| <time>    | numeric  | numeric | ... | numeric |
 ----------- ---------- --------- ----- --------- 
|                     ...                        |
 ----------- ---------- --------- ----- --------- 
| <time>    | numeric  | numeric | ... | numeric |
 ----------- ---------- --------- ----- --------- 
  

Затем у меня есть планировщик, который запускает запрос с использованием формата cron, и я работаю с данными и сохраняю их в своей системной базе данных. Проблема в том, что каждый раз, когда я запускаю запрос с помощью планировщика, у меня будут старые новые записи, чтобы справиться с этим, я фильтрую результаты с помощью pandas, чтобы получить только новые записи, которые на данный момент в порядке (20 секунд для 10 тыс. записей с 20 сериями, думая о том, что у меня есть1 обновление в неделю является разумным), но это не очень хорошее решение в течение длительного времени с большим количеством данных.

Итак, я думаю о том, могу ли я обернуть результаты пользовательского запроса предложением WHERE для фильтрации результатов timestamp на уровне запроса, не касаясь запроса.

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

1. Как выглядит ваш код pandas для фильтрации результатов?

2. @NickODell Я использую df.query("timestamp > @latest_timestamp")

Ответ №1:

Я сделал это таким образом:

 query = f"SELECT sub.* from ({query}) as sub WHERE sub.timestamp > '{latest_timestamp}' ORDER BY sub.timestamp ASC"