#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 ;