ВЫБЕРИТЕ ДИАПАЗОН 1 В 1 ЧАС - POSTGRESQL - PullRequest
0 голосов
/ 28 октября 2019

ЦЕЛЬ

Я хотел бы сделать SELECT в диапазоне 1 час в течение 1 часа

ДАННЫЕТАБЛИЦА

CREATE TABLE t (
    t_id   INT PRIMARY KEY,
    time   TIMESTAMP
);
INSERT INTO t VALUES (1, '2019-10-28 08:00:00');
INSERT INTO t VALUES (2, '2019-10-28 08:30:00');
INSERT INTO t VALUES (3, '2019-10-28 09:00:00');
INSERT INTO t VALUES (4, '2019-10-28 09:30:00');
INSERT INTO t VALUES (5, '2019-10-28 10:00:00');
INSERT INTO t VALUES (6, '2019-10-28 10:30:00');

ЗАПРОС

SELECT
    t_id,
    MIN(time)
FROM
    t
WHERE
    date_trunc('day', time) = current_date
GROUP BY
    t_id,
    date_trunc('hour', time)

ВЫХОД

t_id    min
4   2019-10-28 09:30:00
5   2019-10-28 10:30:00
1   2019-10-28 08:00:00
2   2019-10-28 08:30:00
3   2019-10-28 09:00:00
6   2019-10-28 10:00:00

ВЫХОД ЭСПЕРАДО

t_id    min
1   2019-10-28 08:00:00
3   2019-10-28 09:00:00
5   2019-10-28 10:00:00

Примечание: исправленный вопрос

SQL FIDDLE

1 Ответ

1 голос
/ 28 октября 2019

Вы можете использовать DISTINCT ON для получения первого t_id в час.

SELECT DISTINCT ON (date_trunc('hour', time))
t_id, date_trunc('hour', time)
FROM t
WHERE date_trunc('day', time) = current_date
ORDER BY date_trunc('hour', time), t_id;

DISTINCT ON (date_trunc('hour', time)) вместе с ORDER BY date_trunc('hour', time), t_id позволяет нам получать самое низкое значение t_id за каждый час.

Если вместо этого вам нужен самый первый t_id в порядке времени, вы можете сделать следующее:

SELECT DISTINCT ON (date_trunc('hour', time))
t_id, date_trunc('hour', time)
FROM t
WHERE date_trunc('day', time) = current_date
ORDER BY date_trunc('hour', time), time;

В этом случае они совпадают, но в скрипте, которую вы добавили вкомментарии, это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...