Reputation: 4191
I would like to select
all the rows that contain either min or max datetime values for each equipment_id
, for every day included in the period.
The code below selects the min
and max
datetime values for each equipment_id
over the entire period. What can/should I change to reach desired select results?
Note: the values enclosed in braces in the code snippet represent dynamic values.
select *
from equipment
where created_at in (select min(created_at)
from equipment
where created_at >= {start_datetime} and created_at < {end_datetime}
group by equipment_id
) or
created_at in (select max(created_at)
from equipment
where created_at >= {start_datetime} and created_at < {end_datetime}
group by equipment_id
)
order by account, equipment_id, created_at asc;
Upvotes: 0
Views: 1379
Reputation: 107567
Use to_date
to extract date from datetime value. Then, join on an aggregate query:
with agg as
(select to_date(created_at) as created_date,
equipment_id,
min(created_at) as min_created_at,
max(created_at) as max_created_at
from equipment
group by to_date(created_at),
equipment_id
)
select e.*
from equipment e
left join agg
on e.equipment_id = agg.equipment_id
and to_date(e.created_at) = agg.created_date
where e.created_at in (agg.min_created_at,
agg.max_created_at)
Upvotes: 0
Reputation: 1269583
Use window functions:
select e.*
from (select e.*,
min(e.created_at) over (partition by e.equipment_id, to_date(e.created_at)) as min_ca,
max(e.created_at) over (partition by e.equipment_id, to_date(e.created_at)) as max_ca
from equipment e
) e
where e.created_at in (min_ca, max_ca)
order by account, equipment_id, created_at asc;
Upvotes: 1