Как объединить результаты подзапроса с результатами функции - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать 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 (я пропускаю код для группы, потому что здесь это не проблема)

1 Ответ

1 голос
/ 14 ноября 2019

Следуя советам Ильи, я все заработал:

series = func.generate_series(
    start_date,
    end_date,
    datetime.timedelta(hours=1)
).alias('hour')

subquery = (
    session
    .query(data)
    .filter(data.point_id == point_id)
    .filter(data.date_time >= start_date)
    .filter(data.date_time < end_date)
    .subquery()
)

r = (
    session
    .query(
        column('hour'),
        func.avg(subquery.c.value).label('avg')
    )
    .select_from(series)
    .outerjoin(
        subquery,
        func.date_trunc('hour', subquery.c.date_time) == column('hour')
    )
    .group_by(column('hour'))
    .order_by(column('hour'))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...