首页/数据/数仓建模速查/案例:酒店预订入住建模
建模基础69 条

案例:酒店预订入住建模

酒店域:预订事实(预订-取消-入住-离店流程)+ 房晚事实;房型、渠道、价格计划为维度;入住率/RevPAR 由房晚与房源库存计算。

数仓建模速查数据更新于 2026-10-13

酒店预订入住建模

酒店域通常建两张事实表:预订事实用累积快照表达预订、取消、入住、离店等关键时点,一行一次预订;房晚事实一行一个房型住一晚,是收入与入住率的计算基础。房型、渠道、价格计划为维度。入住率与 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、房晚数
房源库存(可售房数)来自客房维或库存快照,计算入住率时作为分母:分母缺失时指标会直接变成空值或异常放大,库存表必须覆盖全部营业日期。
预订流程的各关键时点要用累积快照表达:只保留最新状态时,取消率、提前期、到店未入住等指标都无法计算,因为中间过程已经被覆盖。
房晚要区分「已实际入住」与「预订未到店」:未到店的订单不产生房晚,把预订夜数直接当作房晚,会把入住率与收入同时算高。

易错点

  • 订单级与房晚级数据混算,入住率失真且无法与库存口径对齐
  • 取消与变更单未建模,预订口径虚高,取消率严重偏低
  • 库存表存在缺日,入住率分母为零或缺失,指标出现异常值
  • 预订状态直接覆盖更新,提前期与取消率等过程指标无法计算

数据来源与参考

  • 酒店数仓实践:房晚与预订模型
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌