Sie wollen ungefähr so etwas
select min_trans_time, min_trans.id as min_trans_time_id,
max_trans_time, max_trans.id as max_trans_time_id
from (
select trans_date,
max(trans_time) as max_trans_time,
min(trans_time) as min_trans_time,
from trans
group by trans_date) min_max_trans,
trans as min_trans,
trans as max_trans
where min_trans.trans_time = min_max_trans.min_trans_time
and max_trans.trans_time = min_max_trans.max_trans_time
Was möglicherweise nicht stabil ist, wenn mehrere trans
es dasselbe teilen trans_time
( dh, wenn die Abfrage für denselben Datensatz ausgeführt wird, kann dies zu unterschiedlichen Ergebnissen führen. Eine einfache Möglichkeit, dies zu lösen, besteht darin, die maximale oder minimale ID auszuwählen. Zum Beispiel könnte dies natürlich die Ergebnisse beeinflussen :).
Sie können auch Fensterfunktionen verwenden, wenn Sie PostgreSQL 8.4 oder höher verwenden. Sie bieten eine klarere Abfrage (klar, wenn Sie mit Fensterfunktionen vertraut sind :), und sie ermöglichen es Ihnen, Dinge zu tun, die mit der obigen Strategie ziemlich schwierig zu tun sind (z. B. den 2. höheren Wert anstelle des Maximums zu erhalten). Nach meiner kurzen Erfahrung schnitten sie jedoch schlechter ab als der hier vorgeschlagene Self-Join-Ansatz. Erwins Antwort enthält eine Version der Abfrage mit Fensterfunktionen. Es wäre interessant festzustellen, welche Abfrage besser ausgeführt wird und / oder besser optimiert werden kann (durch Hinzufügen von Indizes usw.).