Sql 每日的 平均入住人数对于特定的日期范围
每个客户有两个条目,一个用于入住,一个用于退房。Sql 每日的 平均入住人数对于特定的日期范围,sql,Sql,每个客户有两个条目,一个用于入住,一个用于退房。 我必须找出某个日期范围内的每日平均入住人数。在下面的查询中,您的数据中不存在的任何日期在计算您的平均入住人数或退房人数时,都不会计算在内。如果您知道每个日期至少有一个活动,这应该是好的 ID Event Date 101 in 08/26/2019 101 out 08/28/2019 102 in 08/27/2019 102 out 09/01/2019 您可以使用pivot将输入和输出转换为列,然后
我必须找出某个日期范围内的每日平均入住人数。在下面的查询中,您的数据中不存在的任何日期在计算您的平均入住人数或退房人数时,都不会计算在内。如果您知道每个日期至少有一个活动,这应该是好的
ID Event Date
101 in 08/26/2019
101 out 08/28/2019
102 in 08/27/2019
102 out 09/01/2019
您可以使用pivot将输入和输出转换为列,然后您可以轻松找到平均值。我已找到每天停留的客户总数:
set @checkin_count = 0;
set @checkout_count = 0;
set @start_date = '2019-08-26';
set @end_date = '2019-09-02';
set @date_diff = datediff(@end_date,@start_date);
set @date_counter = 0;
select sum(current_guest_count)/datediff(@end_date,@start_date) as avg_num_of_stays
from (
select
ID
,Event
,case
when Event = 'in' then @checkin_count := @checkin_count + 1
when Event = 'out' then @checkout_count := @checkout_count + 1
end
,(@checkin_count - @checkout_count) as current_guest_count
,Date
from stays
order by Date asc
) a
where Date between @start_date and @end_date;
注意:DATES子查询用于获取范围开始和结束之间的所有日期。如果在某一天没有客户入住或退房,我们仍然需要将该客户计算为已入住,因为该客户在前一天入住,几天后退房
干杯 这可能会给您带来正确的方向:
SELECT
D.DATES,
COUNT(CASE
WHEN OUR_DATA.ID IS NOT NULL THEN 1
ELSE 0
END) CUSTOMERS_PER_DAY
FROM
(
SELECT
*
FROM
(
SELECT
ID,
EVENT,
DATE
FROM
YOUR_TABLE
) PIVOT (
MAX ( DATE )
FOR EVENT
IN ( 'in' AS IN_DATE, 'out' AS OUT_DATE )
)
) OUR_DATA
RIGHT JOIN (
SELECT
DATE_RANGE_START + LEVEL AS DATES
FROM
DUAL
CONNECT BY
LEVEL <= DATE_RANGE_END - DATE_RANGE_START
) D ON ( D.DATES BETWEEN IN_DATE AND OUT_DATE )
GROUP BY
D.DATES
我希望这是您正在寻找的解决方案。这些步骤包括1创建从开始日期到结束日期的日期列表,2为每个客户创建一行输入和输出日期,3使用外部连接计数每天的客户数
with data as (
select ID, min(Date) as checkin, max(Date) as checkout
from T group by ID /* assumes only one stay per customer */
)
select
sum(
datediff(days,
case when @start > checkin then @start else checkin end,
case when @end < checkout then @end else checkout end
) - 1 /* assumes checkout day isn't counted */
) * 1.0 / (datediff(days, @start, @end) - 1)
from data
where @start < checkout and @end > checkin;
为了避免混淆,您可以共享上面输入的所需输出吗?SQL只是多个dbms供应商使用的一种语言。这是哪个数据库管理系统?阅读此文。日期函数依赖于数据库,因此请告诉用户您真正使用的数据库。。如果任何答案解决了您的问题,那么请输入预期输出,这样您的问题就标记为已解决。
with daylist as
(
select convert(datetime, "08/22/2019") as days
union all
select dateadd(dd, 1, days)
from daylist
where days < convert(datetime, "09/03/2019")
)
select d.days, sum(case when t.id is null then 0 else 1 end)
from daylist d
left join
(
select a.id, a.dait as indate, b.dait as outdate
from yourtable a
inner join yourtable b on a.id = b.id
where a.event = "in"
and b.event = "out"
) t
on d.days between convert(datetime, t.indate) and convert(datetime, t.outdate)
group by d.days