You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server合并多查询:获取指定日期各房间占用信息及null值处理

解决方案

1. 用单条查询替代循环获取各房间对应记录

可以借助ROW_NUMBER()窗口函数按roomId分组,对符合条件的记录排序后取每组第一条,一次性返回所有房间的目标行,无需循环执行多次查询。

2. 处理dateFreed为NULL的场景

根据需求,当dateFreed为NULL(房间首次登记未释放)时需选中该行,我们可以在筛选条件中纳入dateFreed IS NULL,同时在排序时将NULL值优先排列,确保这类记录被选中。

最终SQL查询

WITH RankedSchedules AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY roomId 
            ORDER BY CASE WHEN dateFreed IS NULL THEN 1 ELSE 0 END DESC, dateFreed DESC
        ) AS rn
    FROM schedule
    WHERE 
        (dateFreed IS NULL OR dateFreed < [providedDate])
)
SELECT * 
FROM RankedSchedules 
WHERE rn = 1;

逻辑说明

  • 分组排名:通过PARTITION BY roomId将数据按房间分组,ROW_NUMBER()给每组内的记录编号;排序时先把dateFreed为NULL的记录排在最前,再按dateFreed倒序,保证每个房间的目标记录排名为1。
  • 条件筛选:(dateFreed IS NULL OR dateFreed < [providedDate])既覆盖了未释放的房间,也保留了原查询中“在指定日期前已释放”的记录逻辑。
  • 结果提取:仅取每组排名为1的记录,即每个房间对应的目标行。

业务逻辑修正(可选)

如果你的核心需求是展示指定日期当天被占用的房间,原查询的dateFreed < [providedDate]逻辑可能偏差(会筛选出已释放的房间),正确的占用判断条件应为:

WHERE 
    dateRegistered <= [providedDate] 
    AND (dateFreed IS NULL OR dateFreed > [providedDate])

可根据实际业务场景调整。

内容的提问来源于stack exchange,提问作者Abraham Tellez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:30:43