Как использовать подзапросы в SQLAlchemy для получения скользящей средней?

Моя проблема в том, что я хочу получить как список измерений, так и скользящую среднюю этих измерений. Я могу сделать это с помощью этого оператора SQL (синтаксис интервала postgresql):

SELECT time, value, ( SELECT AVG(t2.value) FROM measurements t2 WHERE t2.time BETWEEN t1.time - interval '5 days' AND t1.time ) moving_average FROM measurements t1 ORDER BY t1.time; 

Я хочу иметь код SQLAlchemy для создания аналогичного утверждения для этого. В настоящее время у меня есть этот код Python:

 moving_average_days = # configureable value, defaulting to 5 t1 = Measurements.alias('t1') t2 = Measurements.alias('t2') query = select([t1.c.time, t1.c.value, select([func.avg(t2.c.value)], t2.c.time.between(t1.c.time - datetime.timedelta(moving_average_days), t1.c.time))], t1.c.time > (datetime.datetime.utcnow() - datetime.timedelta(ndays))). \ order_by(Measurements.c.time) 

Это, однако, генерирует этот SQL:

 SELECT t1.time, t1.value, avg_1 FROM measurements AS t1, ( SELECT avg(t2.value) AS avg_1 FROM measurements AS t2 WHERE t2.time BETWEEN t1.time - %(time_1)s AND t1.time ) WHERE t1.time > %(time_2)s ORDER BY t1.time; 

Этот SQL имеет подзапрос как часть предложения FROM, где он не может иметь скалярный доступ к значениям столбца значений верхнего уровня, то есть вызывает PostgreSQL, чтобы выплюнуть эту ошибку:

 ERROR: subquery in FROM cannot refer to other relations of same query level LINE 6: WHERE t2.time BETWEEN t1.time - interval '5 days' AN... 

То, что я хотел бы узнать, это: как мне заставить SQLAlchemy переместить подзапрос в предложение SELECT?

Альтернативным вариантом может стать другой способ получения скользящей средней (без выполнения запроса для каждой пары (время, значение)).

  • Как обновить запись строки SQLAlchemy?
  • Соединение UniqueConstraint с функцией
  • Несколько доменов и поддоменов в одном экземпляре Pyramid
  • Python 'startswith' эквивалент для SqlAlchemy
  • SQLAlchemy Соединение с проблемой подзапроса
  • Sqlite / SQLAlchemy: как применять внешние ключи?
  • Как подключиться к SQL Server через sqlalchemy с помощью проверки подлинности Windows?
  • Регулярные выражения в запросах SQLalchemy?
  • One Solution collect form web for “Как использовать подзапросы в SQLAlchemy для получения скользящей средней?”

    Правильно, очевидно, что мне нужно было использовать так называемый скалярный выбор . С помощью этих я получаю этот код python, который фактически работает так, как я хочу, чтобы он (генерирует эквивалентный SQL к первому в моем вопросе, который был моей целью):

     moving_average_days = # configurable value, defaulting to 5 ndays = # configurable value, defaulting to 90 t1 = Measurements.alias('t1') ###### t2 = Measurements.alias('t2') query = select([t1.c.time, t1.c.value, select([func.avg(t2.c.value)], t2.c.time.between(t1.c.time - datetime.timedelta(moving_average_days), t1.c.time)).label('moving_average')], t1.c.time > (datetime.datetime.utcnow() - datetime.timedelta(ndays))). \ order_by(t1.c.time) 

    Это дает этот SQL:

     SELECT t1.time, t1.value, ( SELECT avg(t2.value) AS avg_1 FROM measurements AS t2 WHERE t2.time BETWEEN t1.time - :time_1 AND t1.time ) AS moving_average FROM measurements AS t1 WHERE t1.time > :time_2 ORDER BY t1.time; 
    Interesting Posts

    Элегантный формат для MAC-адреса в Python 3.2

    Доступ к микрофону в Python

    Ошибка инициализации объекта Python. Или я не понимаю, как работают объекты?

    Как я могу программно изменить фон в Mac OS X?

    Почему это регулярное выражение приводит к четырем элементам?

    Как программно вычислять идентификатор расширения Chrome?

    Объединение кортежей с использованием sum ()

    Как проверить наличие атрибутов и тегов в XML перед разбором?

    Autobahn отправляет пользовательские и широковещательные сообщения из внешнего приложения

    Проблемы с полной деинсталляцией Python 2.7 из Windows 7

    Можете ли вы добиться нечувствительного к регистру «уникального» ограничения в Sqlite3 (с Django)?

    NameError: глобальное имя не определено

    Python: путь установки PIP, что является правильным местом для этого и других аддонов?

    Каков наилучший способ заменить тернарный оператор в Python?

    Исходный интерфейс с Python и urllib2

    Python - лучший язык программирования в мире.