Если вы хотите ровно одну строку - даже если есть связи - тогда используйте row_number()
:
select t.*
from (select t.*, row_number() over (partition by date order by hours desc) as seqnum
from t
) t
where seqnum = 1;
По иронии судьбы, и Postgres, и Oracle (оригинальные теги) имеют то, что я хотел бы рассмотретьЕсть лучшие способы сделать это, но они совершенно разные.
Postgres:
select distinct on (date) t.*
from t
order by date, hours desc;
Oracle:
select date, max(hours) as hours,
max(id) keep (dense_rank first over order by hours desc) as id
from t
group by date;