TSQL: условный запрос

#sql #sql-server #tsql #where

#sql #sql-сервер #tsql #где-предложение

Вопрос:

Я пытаюсь найти способ получить результаты, Occupancy в которых последние Inspection_date и предшествующие последним не равны.

В этом примере единственным результатом будет только номер RoomID 2, потому что: Occupancy для OrderID 201 = ‘Вакантно’ <> Occupancy для OrderID 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 ;