【问题标题】:TSQL : conditional queryTSQL:条件查询
【发布时间】:2016-09-30 23:54:02
【问题描述】:

我试图找到一种方法来获得最新的Inspection_date 中的Occupancy 和最后一个之前的不相等的结果。

在此示例中,只有数字 RoomID 2 将是唯一的结果,因为:Occupancy for OrderID 201 = 'Vacant' 到 Occupancy for OrderID 202 = 'Occupied'。

我有查询的开头,但似乎找不到结束查询的好逻辑。

| RoomID | OrderID | Occupancy | rn |
+--------+---------+-----------+----+
| 01     | 101     | Vacant    | 1  |
| 01     | 102     | Vacant    | 2  |
| 01     | 103     | Occupied  | 3  |
| 01     | 104     | Vacant    | 4  |
| 02     | 201     | Vacant    | 1  |
| 02     | 202     | Occupied  | 2  |
| 02     | 203     | Vacant    | 3  |
| 03     | 301     | Occupied  | 1  |
| 03     | 302     | Occupied  | 2  |
| 03     | 303     | Occupied  | 3  |
| 03     | 304     | Occupied  | 4  |
| 04     | 401     | Occupied  | 1  |
| 04     | 402     | Occupied  | 2  |
| 04     | 403     | Vacant    | 3  |
| 04     | 404     | Occupied  | 4  |


SELECT i.room_number, order_number, Occupancy , row_number() OVER(PARTITION BY room_number ORDER BY Inspection_date DESC) rn 
FROM #inspection_data i 

【问题讨论】:

    标签: sql sql-server tsql where


    【解决方案1】:

    在 SQL Server 2012+ 中,你可以使用lag(),所以是这样的:

    SELECT i.*
    FROM (SELECT i.room_number, order_number, Occupancy ,
                 ROW_NUMER() OVER (PARTITION BY room_number ORDER BY Inspection_date DESC) as seqnum,
                 LAG(Occupancy) OVER (PARTITION BY room_number ORDER BY Inspection_date) as prev_Occupancy
          FROM #inspection_data i
         ) i
    WHERE prev_Occupancy <> Occupancy AND seqnum = 1 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2019-11-14
      • 2013-05-23
      • 2023-04-07
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多