Sql Postgres查询每日入住率?

Sql Postgres查询每日入住率?,sql,postgresql,select,Sql,Postgresql,Select,表e_log中有time_event(timestamp)和event_type两列(“e”或“X”表示进入或退出)。晚上没有人,所以在给定的一天,入住率是Es减去Xs,其中time_事件是当天。我试图查询2019年每天的入住率,结果应该是 日入住率 2019-01-01 14 2109-01-02 22 . . . 有什么建议吗?最接近的是对每个特定的日子进行硬编码并计算条目的数量,但我不确定如何获得当天条目-出口最大值的点。例如,此查询将始终返回0,因为每个人都会在午夜前离开- sele

表e_log中有time_event(timestamp)和event_type两列(“e”或“X”表示进入或退出)。晚上没有人,所以在给定的一天,入住率是Es减去Xs,其中time_事件是当天。我试图查询2019年每天的入住率,结果应该是

日入住率
2019-01-01 14
2109-01-02 22
.
.
.

有什么建议吗?最接近的是对每个特定的日子进行硬编码并计算条目的数量,但我不确定如何获得当天条目-出口最大值的点。例如,此查询将始终返回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);
选择sum(事件发生时的情况_type='E',然后是1 else-1 end)
从e_日志
其中e_log.time_event>cast('2019-01-01 00:00:00'作为时间戳)和
e_log.time_事件

谢谢你的建议

根据一天中的最高入住率进行编辑

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链接

你的思路是正确的,只需要按演员(时间事件为日期)分组,如下所示

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)  
小提琴链接

如果我理解正确,我倾向于这样写:

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;
选择日期(日期、时间、事件)作为dte,
(计数(*)过滤器(其中事件类型='E')-
计数(*)筛选器(其中事件类型='X')
)
从e_log l
其中e.time_event>='2019-01-01'::时间戳
e、 时间事件<'2020-01-01'::时间戳
按dte分组
dte订购;

谢谢,这是按天分组的,但我仍然不知道如何获得入住率。这将导致每天0,因为每个人都会在午夜前离开。考虑这种情况- 1月1日表有四个条目2019-01-01 11:00 00′E′2019-01-01 11:01O'x' 2019-01-01 11:02:'E'2019-01-01 11:03'x'占用不超过1。但如果按时间排序的条目是“E”、“E”、“X”、“X”,那么截至11:01,占用率为2。我想不出一个方法来做这个,也许是某种功能?有什么想法吗?如果你看到的是一天中入住率最高的时间,那么可以使用以下分析功能。请看一看,如果它解决了,请将答案标记为正确答案