Функции работы с окнами в Postgresql дают несколько способов получить то, что вы хотите. Я не использовал их достаточно, чтобы знать, какой (если есть) из небольших вариантов лучше всего оптимизирован, но одна версия -
SELECT dt, sec, t0, p0, t1, p1 FROM
(
SELECT dt, sec, first_value(tm) over date_window as t0,
first_value(price) OVER date_window AS p0,
last_value(tm) OVER date_window AS t1,
last_value(price) OVER date_window AS p1,
rank() OVER date_window AS r
FROM a
WINDOW date_window AS (PARTITION BY dt, sec ORDER BY tm
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
) AS subquery
WHERE r=1;
Я изменил имена полей, чтобы избежать зарезервированных слов.