Postgresql, вывод результата из выбора с +1 часом - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующее SQL, которое работает на GROUP BY час:

SELECT
CONCAT(TO_CHAR(timestamp::timestamp, 'YYYY-MM-DD HH'), ':00:00') as time_from,
car_id,
SUM(km) as driven from car_data
group by TO_CHAR(timestamp::timestamp, 'YYYY-MM-DD HH'), car_id
order by time_from, car_id;

Я бы хотел дополнительный вывод, который составляет time_from +1 часовой интервал. Я пробовал с:

SELECT
CONCAT(TO_CHAR(timestamp::timestamp, 'YYYY-MM-DD HH'), ':00:00') as time_from,
CONCAT(TO_CHAR(timestamp::timestamp + interval '1 hour', 'YYYY-MM-DD HH'), ':00:00') as time_to,
car_id,
SUM(km) as driven from car_data
group by TO_CHAR(timestamp::timestamp, 'YYYY-MM-DD HH'), car_id
order by time_from, car_id;

Но это сообщает, что мне нужно GROUP BY это поле также:

ERROR:  column "car_data.time" must appear in the GROUP BY clause or be used in an aggregate function

, чего я не хочу делать. Как я могу лучше всего заархивировать это?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Один из вариантов - поместить текущий рабочий запрос в CTE, а затем использовать его для генерации требуемого вывода:

WITH cte AS (
    SELECT
        timestamp::timestamp AS time_from,
        car_id,
        SUM(km) AS driven
    FROM car_data
    GROUP BY timestamp::timestamp, car_id
)

SELECT
    CONCAT(TO_CHAR(time_from, 'YYYY-MM-DD HH'), ':00:00') AS time_from,
    CONCAT(TO_CHAR(time_from + interval '1 hour', 'YYYY-MM-DD HH'), ':00:00') AS time_to,
    car_id,
    driven
FROM cte
ORDER BY
    time_from, car_id;
0 голосов
/ 03 июля 2018

Вы можете просто добавить две колонки в group by:

SELECT CONCAT(TO_CHAR(timestamp::timestamp, 'YYYY-MM-DD HH'), ':00:00') as time_from,
       CONCAT(TO_CHAR(timestamp::timestamp + interval '1 hour', 'YYYY-MM-DD HH'), ':00:00') as time_to,
       car_id,
       SUM(km) as driven 
FROM car_data
GROUP BY time_from, time_to, car_id 
ORDER BY time_from, car_id;

Однако я бы не конвертировал метки времени в строки. Вместо этого используйте date_trunc():

SELECT date_trunc('hour', timestamp::timestamp) as time_from,
       date_trunc('hour', timestamp::timestamp) + interval '1 hour' as time_to,
       car_id,
       SUM(km) as driven 
FROM car_data
GROUP BY date_trunc('hour', timestamp::timestamp), car_id 
ORDER BY time_from, car_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...