【问题标题】:TSQL: First instance of XTSQL:X 的第一个实例
【发布时间】:2016-07-02 04:14:08
【问题描述】:

我需要获取所有Room_IDs 第一次报告Occupancy 空置的情况,因此只有当Occupancy 的最后一个实例空置并且在Room_ID 的生命周期内连续没有中断时与InspectionDate 相关(不包括例如已占用> 空置> 已占用> 空置或空置> 已占用或空置> 已占用> 空置> 空置但包括空置> 空置)

这是我用作示例的简化表:

 Room_Id    inspection_ID   Occupancy InspectionDate
 ----------------------------------------------------
   1        11              vacant       5/15/2015
   1        12              occupied     5/21/2015
   1        13              vacant       9/19/2015
   1        14              occupied     1/16/2016
   2        21              vacant       3/25/2015
   2        22              occupied     8/27/2015
   2        23              occupied     4/17/2016
   3        31              occupied    12/12/2015
   3        32              occupied     3/22/2015
   3        33              vacant        2/2/2016
   3        34              occupied     3/24/2016
   4        41              occupied     4/17/2015
   4        42              occupied    11/12/2015
   4        43              occupied    12/22/2015
   4        44              vacant        2/2/2016
   4        45              vacant       3/24/2016
   5        45              vacant       3/24/2015
   5        45              vacant       3/24/2016

我的结果应该是这样的:

 Room_Id    inspection_ID   Occupancy InspectionDate
 ---------------------------------------------------
   4        41              occupied     4/17/2015
   4        42              occupied    11/12/2015
   4        43              occupied    12/22/2015
   4        44              vacant        2/2/2016
   4        45              vacant       3/24/2016
   5        45              vacant       3/23/2015
   5        45              vacant       3/24/2016

如果不够清楚,请告诉我。

【问题讨论】:

标签: sql-server tsql group-by


【解决方案1】:
select * from T where Room_ID in (    
    select Room_ID from T
    group by Room_ID
    having
          coalesce(
              max(case when occupancy = 'occupied' then InspectionDate end),
              cast('19000101' as date)
          ) <
          min(case when occupancy = 'vacant' then InspectionDate end)
);

如果having 条件为真,则所有空缺的出现都晚于被占的时间(或者当没有空缺时出现一个虚拟日期。)

以下是使用分析的相同方法:

select * from
( 
    select *,
        max(case when occupancy = 'occupied' then InspectionDate end)
            over (partition by Room_ID, occupancy) as max_o
        min(case when occupancy = 'vacant'   then InspectionDate end)
            over (partition by Room_ID, occupancy) as min_v
    from T
) t
where max_o < min_v or max_o is null and max_v is not null;

检查计划,看看哪一个效果更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2021-10-03
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多