2015-04-06 2 views
0

У меня есть база данных, где я ищу, чтобы получить текущие номера комнат и номера предыдущих номеров.Текущий и предыдущий статус T-SQL

Данные выглядят следующим образом. Таблица X

Name, room_number, Start_Date, End_Date, status 
Bob, A1, 2015-04-03, null, transfer 
Bob, B5, 2013-04-15, 2015-04-03, somestatus 
Bob, B7, 2011-04-15, 2013-04-15, someotherstatus 
Smith, A2, 2015-04-03, null, transfer 
Smith, B4, 2013-10-15, 2015-04-03, someotherstatus 
Smith, B8, 2011-04-15, 2013-10-15, somestatus 

То, что я хочу, чтобы вернуть это ниже.

Bob, A1, 2015-04-03, null, перевод Текущий номер Bob, B5, 2013-04-15, 2015-04-03 Предыдущая комната Smith, A2, 2015-04-03, null, перевод Текущий номер Smith, B4, 2013-10-15, 2015-04-03 Предыдущая комната

Пожалуйста, дайте мне знать, если это достаточно ясно.

То, что я в настоящее время является

Select Name, room_number, Start_Date, End_Date, status 
from TableX 
where start_date = today 
and status = transfer 

, который дает мне все люди номера. Не уверен, как получить номера предыдущих номеров, потому что статус вне передачи ничего не значит. Общность в том, что дата окончания не нулевое значение, если это их текущий номер

Благодаря

+0

Какая версия SQL Server вы используете? – Stephan

+0

Я использую SQL 2005 –

ответ

0
CREATE VIEW RoomChange 
AS 
WITH CTE 
AS 
(

    SELECT Name, 
      room_number, 
      [Start_Date], 
      [end_date], 
      ROW_NUMBER() OVER (PARTITION BY name ORDER BY [Start_date]) room_order 
    FROM TableX 
) 


SELECT A.name, 
     A.[Start_Date], 
     A.room_number, 
     B.[Start_Date] prev_room_start, 
     B.room_number AS prev_room 
FROM CTE A 
INNER JOIN CTE B 
ON A.room_order = B.room_order + 1 
    AND A.Name = B.name 
WHERE A.[end_date] IS NULL --only grab latest room 
GO 


SELECT * 
FROM RoomChange 

Результаты:

name Start_Date room_number prev_room_start prev_room 
----- ---------- ----------- --------------- --------- 
Bob 2015-04-03 A1   2013-04-15  B5 
Smith 2015-04-03 A2   2013-10-15  B4 
+0

Я сейчас работаю над этим, нечетным почему-то WHERE [end_date] IS NULL заявляет, что это недопустимый столбец, который является странным –

+0

thats it. Спасибо –

+0

Это было потому, что я забыл добавить его в свой список столбцов в моем CTE. Если вы хотите использовать другие столбцы, добавьте их в CTE. Помните, что CTE aliased «A» содержит текущую комнату, а «B» содержит информацию о предыдущем номере. – Stephan

Смежные вопросы