Postgres запрос на ежедневную занятость? - PullRequest
1 голос
/ 18 февраля 2020

Таблица e_log имеет столбцы time_event (timestamp) и event_type ('E' или 'X' для входа или выхода). В одночасье нет людей, поэтому в данный день занятость составляет Es минус X, где time_event - это тот день. Я пытаюсь сделать запрос на занятость каждого дня 2019 года, результат должен быть

Заполнение дня
2019-01-01 14
2109-01-02 22 * ​​1005 *.
.
.

Есть предложения? Наиболее близким является жесткое кодирование каждого указанного c дня и подсчет количества записей, но я не уверен, как получить точку в тот день, когда записи - выходы - макс. Например, этот запрос всегда будет возвращать 0, потому что все уходят к полуночи -

select sum(case when event_type ='E' then 1 else -1 end)
from e_log
where e_log.time_event > cast('2019-01-01 00:00:00' as timestamp) and
      e_log.time_event < cast('2019-01-01 23:59:00' as timestamp);

Спасибо за любые предложения!

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Изменено на основе max_occupancy во время дня

with data
  as( 
    select cast(e_log.time_event as date) day_val
           ,e_log.time_event
           ,sum(case when event_type ='E' then 1 
                     when event_type='X' then -1 
                 end) over(partition by cast(e_log.time_event as date) order by e_log.time_event) as total_occupancy
      from e_log 
     )
    ,ranked_by_max_occupancy
     as (
        select row_number() over(partition by day_val order by total_occupancy desc) as rnk
               ,*
          from data
         )
select *
  from ranked_by_max_occupancy
 where rnk=1 

Обновлена ​​ссылка на dbfiddle https://dbfiddle.uk/?rdbms=postgres_12&fiddle=3d924f2187373d764325ed555361a9ab

Вы находитесь на правильном пути, просто нужно сгруппировать его по касту (time_event как дата) следующим образом

select cast(e_log.time_event as date)
       ,sum(case when event_type ='E' then 1 
                 when event_type='X' then -1 
             end) as total_occupancy
  from e_log 
group by cast(e_log.time_event as date)  

дБ, скриптовая ссылка https://dbfiddle.uk/?rdbms=postgres_12&fiddle=bb85ea98329829572ed1f234d90640f6

0 голосов
/ 18 февраля 2020

Если я правильно понимаю, я был бы склонен написать это как:

select date_trunc('day', time_event) as dte,
       (count(*) filter (where event_type = 'E') -
        count(*) filter (where event_type = 'X')
       )
from e_log l
where e.time_event >= '2019-01-01'::timestamp
      e.time_event < '2020-01-01'::timestamp
group by dte
order by dte;
...