2016-09-30 3 views
0

J'essaie de trouver un moyen d'obtenir des résultats où le Occupancy dans le dernier Inspection_date et l'avant-dernier ne sont pas égaux.TSQL: requête conditionnelle

Dans cet exemple, seul numéro RoomID 2 sera le seul résultat parce que: les Occupancy pour OrderID 201 = « Libre » <> au Occupancy pour OrderID 202 = « occupés ».

J'ai le début de la requête, mais je n'arrive pas à trouver une bonne logique pour terminer la requête.

| 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 

Répondre

1

Dans SQL Server 2012+, vous pouvez utiliser lag(), donc quelque chose comme ceci:

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

parfait merci! –