[英]SQL Query to Select Min and Max Values For Each Day Over a Period
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. 我想
select
所有包含要么最小或最大datetime值的每一行equipment_id
,对在期限内的每一天 。
The code below selects the min
and max
datetime values for each equipment_id
over the entire period. 下面的代码为整个期间内的每个
equipment_id
选择min
和max
日期时间值。 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;
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;
Use to_date
to extract date from datetime value. 使用
to_date
从datetime值中提取日期。 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.