SQL-запрос для выбора минимальных и максимальных значений для каждого дня за период - PullRequest
1 голос
/ 15 мая 2019

Я хотел бы select все строки, которые содержат минимальные или максимальные значения даты и времени для каждого equipment_id, для каждый день , включенных в период.

Приведенный ниже код выбирает значения даты и времени min и max для каждого equipment_id в течение всего периода. Что можно / нужно изменить, чтобы достичь желаемых результатов выбора?

Примечание: значения, заключенные в фигурные скобки в фрагменте кода, представляют динамические значения.

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;

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Использовать оконные функции:

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;
0 голосов
/ 16 мая 2019

Используйте to_date для извлечения даты из значения даты и времени. Затем присоединитесь к агрегированному запросу:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...