I have the following table:
CREATE TABLE trans (
id SERIAL PRIMARY KEY,
trans_date date,
trans_time time
);
I want to have the following view
CREATE OR REPLACE VIEW daily_trans AS
SELECT trans_date,
max(trans_time) as first,
min(trans_time) as last,
calculate_status(min(trans_time), max(trans_time)) as status
GROUP BY trans_date
with columns that specify the ids of the max and min trans_time.
How do I do that?
Best Answer
You can calculate this in one step with window functions:
I added
id
as secondaryORDER
column in the window clause, to make the sort order stable in case of identical times per day.If you are not familiar with window functions, be sure to read this chapter of the manual.
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
is a not so commonly used clause to adjust the window frame, because we wantlast_value()
to always return the last value of the whole partition (the date), not the last value up to the current (including peers) according to the sort order.How you to combine
DISTINCT
with window functions: