酒店预订入住建模
酒店域通常建两张事实表:预订事实用累积快照表达预订、取消、入住、离店等关键时点,一行一次预订;房晚事实一行一个房型住一晚,是收入与入住率的计算基础。房型、渠道、价格计划为维度。入住率与 RevPAR 由房晚数据与房源库存(可售房数)计算,分母来自客房维或库存快照。
基本信息
| 事实表 | 预订流程事实 + 房晚事实 |
|---|---|
| 维度 | 房型 / 渠道 / 价格计划 / 酒店 |
| 关键指标 | 入住率、RevPAR、平均房价 |
| 库存来源 | 客房维或库存快照,提供可售房数 |
| 粒度差异 | 订单级 vs 房晚级 |
| 流程表达 | 累积快照保留预订与离店等关键时点 |
典型使用场景
- 入住率:用房晚数除以可售房数,按日与按店统计
- RevPAR:每间可售房收入,是酒店经营的核心对比指标
- 渠道分析:比较不同渠道的房价与取消率
- 取消预测:基于预订到入住的时间跨度分析取消概率
- 价格计划评估:对比不同价格计划的房晚贡献与平均房价
房晚事实与经营指标
房晚事实与经营指标
CREATE TABLE fact_room_night (
stay_date string,
hotel_sk bigint,
room_type_sk bigint,
room_nights int,
revenue decimal(18,2)
)
PARTITIONED BY (dt string) STORED AS ORC;
SELECT h.hotel_id, f.stay_date,
sum(f.room_nights) / sum(i.available_rooms) AS occ_rate, -- 入住率 = 房晚 ÷ 可售房数
sum(f.revenue) / sum(i.available_rooms) AS revpar -- RevPAR = 收入 ÷ 可售房数
FROM fact_room_night f
JOIN dim_inventory i ON i.hotel_sk = f.hotel_sk AND i.stay_date = f.stay_date
GROUP BY h.hotel_id, f.stay_date;订单级与房晚级的分工
| 事实表 | 粒度 | 典型指标 |
|---|---|---|
| 预订事实 | 一次预订一行 | 预订量、取消率、提前期 |
| 房晚事实 | 一房型一晚一行 | 入住率、RevPAR、房晚数 |
房源库存(可售房数)来自客房维或库存快照,计算入住率时作为分母:分母缺失时指标会直接变成空值或异常放大,库存表必须覆盖全部营业日期。
预订流程的各关键时点要用累积快照表达:只保留最新状态时,取消率、提前期、到店未入住等指标都无法计算,因为中间过程已经被覆盖。
房晚要区分「已实际入住」与「预订未到店」:未到店的订单不产生房晚,把预订夜数直接当作房晚,会把入住率与收入同时算高。