Đúng vậy, rõ ràng những gì tôi cần là sử dụng cái gọi là vô hướng chọn . Với việc sử dụng những cái mà tôi nhận được mã python này, mã này thực sự hoạt động như tôi muốn (tạo SQL tương đương với SQL đầu tiên trong câu hỏi của tôi, đó là mục tiêu của tôi):
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)
Điều này tạo ra SQL này:
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;