Как правильно составить запрос для взятия первого значения из группы?
Ну а когда станет скучно перебирать всю таблицу - обращайтесь :-)
Postgresql 9.4 и выше, выбор по известному диапазону дат через index scan по timestamp полю:select day, data 
from generate_series('2017-12-10', '2017-12-12', interval '1 day') as day, 
lateral (
    select data from tablename 
    where "timestamp" between day and day + interval '1 day' 
    order by "timestamp" desc limit 1
) ljd;
Все дни из таблицы по индексу:with recursive t as (
(select "timestamp"::date as day, data from tablename order by "timestamp" desc limit 1)
union all
select bpt.* from t, lateral (
select "timestamp"::date as day, data from tablename where "timestamp" < t.day order by "timestamp" desc limit 1
) as bpt
)
select * from t;
Используя loose index scan
Без дополнительных условий задачи можно такSELECT
  date_trunc('day', sub."timestamp") AS "day",
  sub."data"
FROM (SELECT
        "timestamp",
        "data",
        row_number() OVER ( PARTITION BY date_trunc('day', "timestamp")
          ORDER BY "timestamp" DESC ) AS rownum
      FROM "table") sub
WHERE sub.rownum = 1
Только следует помнить, что этот вариант переберет все записи в таблице, поэтому может оказаться неприменимым для больших таблиц