Я пытаюсь использовать SQLAlchemy, чтобы написать запрос вроде этого:
SELECT
hour,
avg(value)
from
generate_series('2019-10-01T00:00:00'::timestamp, '2019-10-01T23:00:00'::timestamp, '0 days 3600.000000 seconds'::interval) AS hour
left outer join
(
select
*
from
data
where
parent_id=10 and
date_time >= '2019-10-01T00:00:00'::timestamp and
date_time < '2019-10-02T00:00:00'::timestamp
) "inn" on date_trunc('hour', inn.date_time) = hour
group by
hour
order by
hour;
В моей таблице данных есть 3 столбца: parent_id, date_time и value.
Я потратил немногочасов, и я никак не могу заставить его работать так, как описано выше.
Самое близкое, что у меня есть (по крайней мере, семантически это имеет смысл):
series = func.generate_series(
start_date,
end_date,
datetime.timedelta(hours=1)
).label('hour')
subquery = (
session
.query(data)
.filter(data.parent_id == parent_id)
.filter(data.date_time >= start_date)
.filter(data.date_time < end_date)
.subquery()
)
query = (
session
.query(
series
)
.outerjoin(
subquery,
func.date_trunc('hour', subquery.c.reading_date_time) == series
)
)
Но это не такработает, невозможно ссылаться на столбец «час», как это, я получаю ошибку Don't know how to join to SELECT
(я пропускаю код для группы, потому что здесь это не проблема)