редактироватьПолучить последние данные периодической временной метки
Я понял, что мой вопрос действительно состоит из двух частей:
- Как я группа по периодам времени, и
- How do I select a particular row in a group?.
One of the answers ко второму вопросу использует Postgres' SELECT DISTINCT ON, что означает, что я не нужна группа вообще. Я разместил решение ниже.
У меня есть данные, которые обычно запрашиваются, чтобы получить самое последнее значение. Однако мне нужно иметь возможность воспроизвести, какие результаты были бы получены, если бы я каждый час спрашивал, возвращаясь к какой-то временной отметке.
Я не знаю с чего начать. У меня очень мало опыта работы с SQL.
CREATE TABLE history
(
detected timestamp with time zone NOT NULL,
stat integer NOT NULL
)
Я выбираю как:
SELECT
detected,
stat
FROM history
WHERE
detected > '2013-11-26 20:19:58+00'::timestamp
Очевидно, что это дает мне каждый результат, поскольку данной временной метки. Я хочу, чтобы каждый stat
был ближе всего к минутам, начиная с сегодняшнего дня, до отметки времени. Ближе всего я имею в виду «меньше».
Извините, я не приложил ни малейшего усилия, чтобы приблизиться к ответу. Я так незнакома с SQL, я не знаю, с чего начать.
редактировать
Этот вопрос, How to group time by hour or by 10 minutes, кажется полезным:
SELECT timeslot, MAX(detected)
FROM
(
SELECT to_char(detected, 'YYYY-MM-DD hh24:MI') timeslot, detected
FROM
(
SELECT detected
FROM history
where
detected > '2013-11-28 13:09:58+00'::timestamp
) as foo
) as foo GROUP BY timeslot
Это дает мне самую последнюю detected
метку времени на один-минутными интервалами.
Как получить stat
? MAX
работает на всех detected
, сгруппированных по минутах, но stat
недоступен.
второй редактировать
У меня есть:
timeslot;max
"2013-11-28 14:04";"2013-11-28 14:04:05+00"
"2013-11-28 14:17";"2013-11-28 14:17:22+00"
"2013-11-28 14:16";"2013-11-28 14:16:40+00"
"2013-11-28 14:13";"2013-11-28 14:13:31+00"
"2013-11-28 14:10";"2013-11-28 14:10:02+00"
"2013-11-28 14:09";"2013-11-28 14:09:51+00"
Я хотел бы:
detected;stat
"2013-11-28 14:04:05+00";123
"2013-11-28 14:17:22+00";125
"2013-11-28 14:16:40+00";121
"2013-11-28 14:13:31+00";118
"2013-11-28 14:10:02+00";119
"2013-11-28 14:09:51+00";121
max
и detected
такие же
Вы пробовали MAX (обнаружено)? –
@SamS Это вернет один результат, но мне нужно столько результатов, сколько минут прошло с момента времени. –
Я вижу, что вам нужно. Один из способов добиться этого - скопировать данные в другую базу данных и изменить свой запрос, чтобы получить результаты, превышающие максимальную временную метку во второй таблице. Я попытаюсь сделать sqlfiddle. –