2015-07-07 3 views
0

у меня есть имя таблицы RoomInventory, которая имеет данные, такие как нижеSQL Server - вычислить наличие номеров

Date (Date)     RoomsAvailable (int) 
1-Jul-2015       30 
2-Jul-2015       30 
3-Jul-2015       30 
5-Jul-2015       28 
6-Jul-2015       28 
7-Jul-2015       28 
8-Jul-2015       30 
9-Jul-2015       30 
10-Jul-2015       26 
11-Jul-2015       28 
12-Jul-2015       28 

Результат, который я хочу, как показано ниже:

StartDate  EndDate   RoomsAvailable 
---------------------------------------------- 
1-Jul-2015  3-Jul-2015   30 
5-Jul-2015  7-Jul-2015   28 
8-Jul-2015  9-Jul-2015   30 
10-Jul-2015  10-Jul-2015   26 
11-Jul-2015  12-Jul-2015   28 

Пожалуйста, помогите ..

+0

Пожалуйста отправьте ваш запрос пытается до сих пор, и что не работает. –

+0

Есть ли в RoomInventory какие-либо другие поля, например ID? – Matt

+0

Я еще не пробовал, не смог понять, что нужно начинать ...... – user2069823

ответ

-2

На первый взгляд я предлагаю GROUP BY 'RoomsAvailable', в то время как SELECT будет чем-то вроде MIN (Date) StartDate, MAX (Date) EndDate

+0

Я не думаю, что это могло бы сработать: комната 30 i snot availble между 3 и 8, но вы бы получили ее как доступную – Simone

3

Try ниже запроса

DECLARE @Reservation TABLE (BookDate DATE, ROOMS INT) 
INSERT INTO @Reservation VALUES 
('1-Jul-2015',30), 
('2-Jul-2015',30), 
('3-Jul-2015',30), 
('5-Jul-2015',28), 
('6-Jul-2015',28), 
('7-Jul-2015',28), 
('8-Jul-2015',30), 
('9-Jul-2015',30), 
('10-Jul-2015',26), 
('11-Jul-2015',28), 
('12-Jul-2015',28) 


    ;WITH 
    cte AS (
     select ROW_NUMBER() OVER(ORDER BY BookDate) AS RowNumber, 
     [ROOMS], BookDate FROM @Reservation 
    ), 
    cte2 as (
     SELECT TOP 1 RowNumber, 1 as GroupNumber, [ROOMS], BookDate FROM cte ORDER BY RowNumber 
     UNION ALL 
     SELECT c1.RowNumber, 
      CASE WHEN c2.[ROOMS] <> c1.[ROOMS] then c2.GroupNumber + 1 ELSE c2.GroupNumber END AS GroupNumber, c1.[ROOMS], c1.BookDate 
     FROM cte2 c2 join cte c1 on c1.RowNumber = c2.RowNumber + 1  
    ) 
    SELECT Start_Date, End_Date, Rooms 
    FROM 
    ( SELECT MIN(BookDate) AS START_DATE, MAX(BookDate) AS END_DATE ,ROOMS, GroupNumber 
     FROM cte2 
     GROUP BY ROOMS ,GroupNumber 
    ) a 

SQLFiddler Demo

+0

Я просто хочу написать тот же запрос. отлично сработано. +1 для вас – user3583912

1

Если есть много данных, рекурсивное CTE может быть не лучшим решением. Существует также небольшой трюк, который вы можете использовать. Если вы используете DATEDIFF и row_number к группе даты вместе, вы получите результат так:

select 
    min(bookdate), 
    max(bookdate), 
    rooms 
from (
    select 
    bookdate, 
    rooms, 
    datediff(day, 0, bookdate) - row_number() 
     over (partition by rooms order by bookdate asc) as DATEGRP 
    from 
    Reservation 
) X 
group by 
    DATEGRP, 
    rooms 
order by 1 

Здесь DateDiff со дня 0 увеличивается всегда на 1, когда bookdate увеличивается на единицу, и также номер строки увеличивается по одному, это целые дни. Разделите, убедитесь, что только дни с одинаковой доступностью получат последовательные номера. Группировка результата с этим и использование min/max приведет к датам начала и окончания.

SQL Fiddle