求SQL实现:酒店房间87天住宿的所有可行总价计算方案
酒店住宿组合凑单与总价计算解决思路
1. 数据预处理
- 按
HotelCode、RoomType、AccmdMenTypeCode分组,将同属性组的房间时段数据归集,仅在同组内筛选组合,跨组无需处理 - 过滤
OverlapDaysCount为0的记录,这类时段与目标预订期无重叠,无使用价值 - 给每组内的记录按时段起始日期排序,便于后续判断时段衔接逻辑(若需考虑入住连续性),或仅提升组合枚举的清晰度
2. 有效组合筛选
- 单记录达标场景:直接筛选每组内
OverlapDaysCount = 87的记录,这类记录可直接覆盖全部预订期,计算总价为OverlapDaysCount * 单价 - 多记录组合场景:枚举同组内所有记录组合,计算组合的
OverlapDaysCount总和,筛选总和等于87的组合:- 若要求入住时段无重叠,需额外校验组合内各记录的重叠区间无交集;若仅需凑够天数,无需校验时段重叠
- 去重重复组合(如记录A+记录B与记录B+记录A视为同一组合,仅保留一次)
3. 总价计算与结果整理
- 对每个有效组合,计算总价:
Σ(单条记录OverlapDaysCount * 对应单价) - 按
HotelCode、RoomType、AccmdMenTypeCode分组,整理每组内的所有有效总价,按需去重后输出
4. 落地实现参考(以SQL为例)
- 分组使用
GROUP BY HotelCode, RoomType, AccmdMenTypeCode - 单记录达标查询:
SELECT HotelCode, RoomType, AccmdMenTypeCode, OverlapDaysCount * Price AS TotalPrice FROM 房间数据表 WHERE OverlapDaysCount = 87 - 多记录组合可通过递归CTE枚举所有可能的组合,累计天数与总价后筛选符合条件的结果;数据量较小时也可使用多次自连接实现
- 性能优化:先分组再处理,避免全表枚举组合导致的性能损耗
内容的提问来源于stack exchange,提问作者Step
相关产品推荐
相关产品推荐

