2016-09-30 168 views
0

我想找到一种方法来获得结果,其中Occupancy在最新的Inspection_date和最后一个不相等。TSQL:条件查询

在这个例子中仅数RoomID 2将是唯一的结果,因为:所述OccupancyOrderID 201 =“空置” <>到OccupancyOrderID 202 =“占用”。

我有查询的开始,但似乎无法找到一个很好的逻辑来结束查询。

| 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 

回答

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 ; 
+0

完美谢谢! –