简体   繁体   English

SQL查询以在一段时间内每天选择最小值和最大值

[英]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选择minmax日期时间值。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM