求一个房间租赁空置天数问题

低代码开发平台 2023-11-20 11:31:25

表结构如下,房间资料(ID主键,number代码,name名称),租赁合同表(id,房间id,租赁开始日期startdate,租赁结束日期enddate),一个房间可能有多个合同,对应不同起始日期,求每个房间在某个查询时间内的空置天数!

...全文
128 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-11-20
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/8032179, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
njhart2003 2024-02-28
  • 打赏
  • 举报
回复

用子查询 + 分析函数 + 日期类型的减法 实现:

  1. 子查询里使用分析函数lag(enddate , 1 [, default any ]) over(partition by id order by startdate) last_enddate,即根据 房间ID分组,租赁开始日期升序排序,分组内:当前行的开始日期 - 上一行的结束日期,为空置天数;
  2. 外层查询 left join 子查询,并且分组求和:按 房间ID 分组,sum(空置天数)即可。

注意:

  1. 里面的分析函数默认值设置为查询期间的起止日期;
  2. 外连接出现的NULL值转换(有的房子没有出租合同,一直空置)
  • 打赏
  • 举报
回复

SELECT
r.ID AS RoomID,
r.number AS RoomNumber,
r.name AS RoomName,
(SELECT COUNT(DISTINCT date_range.date)
FROM generate_series('2023-01-01'::date, '2023-12-31'::date, '1 day'::interval) date_range(date)
LEFT JOIN lease_contract lc ON r.ID = lc.room_id
WHERE lc.startdate <= date_range.date AND lc.enddate >= date_range.date
AND date_range.date BETWEEN '2023-01-01' AND '2023-12-31') AS VacantDays
FROM room_data r;
generate_series 是一个用于生成日期范围的函数。
LEFT JOIN 用于获取每个房间的租赁情况。
COUNT(DISTINCT date_range.date) 用于计算在查询时间范围内未被租赁的日期数量。
替换 '2023-01-01' 和 '2023-12-31' 为您实际的查询时间范围。

227,005

社区成员

发帖
与我相关
我的任务
社区描述
一个人可以走的很快,一群人才能走的更远!
数据库 企业社区
社区管理员
  • Lucifer三思而后行
  • 韬光养晦208
  • 芒果再努力
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

❤️ 添加版主微信:Lucifer-4622 

🎉【数据库交流社区】联合 【摸鱼社区】本周重磅推出【兄弟社区每日打卡】活动 

🎁 新玩法,奖励升级!

数据库交流社区:https://bbs.csdn.net/forums/lucifer-database

摸鱼社区:https://bbs.csdn.net/forums/moyu

新增抽奖池:6本技术书籍 📚 + 每周社区排名奖品 🏅 ,绝对丰厚!

奖品预览可以参考:CSDN社区赞助奖品一览

⭐️ 活动要求:

1、每日 同时在两个社区 打卡贴进行发帖打卡,提交任务

2、同时在两个社区 坚持 7 天打卡 ,将参与到抽奖名单中,这很重要!

3、参加抽奖请先 添加打卡抽奖群,否则无效,加群请添加微信:Lucifer-4622

【社区积分规则】

  • 在社区「发帖」得10积分
  • 内容被管理员「加精」得10积分
  • 点赞他人内容得1积分
  • 评论内容得2积分

社区玩法👇👇👇

试试用AI创作助手写篇文章吧