2013-08-15 2 views
1

http://sqlfiddle.com/#!2/134badНужна помощь в разрядном сложный SQL запрос

данных, если вы не смогли получить доступ к ссылке:

create table climate (city varchar(10), status char(1), Curdate date); 

insert into climate values ('Chennai', 'S', '2013-08-05'); 
insert into climate values ('Chennai', 'S', '2013-08-06'); 
insert into climate values ('Chennai', 'S', '2013-08-07'); 
insert into climate values ('Chennai', 'S', '2013-08-08'); 

insert into climate values ('Chennai', 'R', '2013-08-09'); 
insert into climate values ('Chennai', 'R', '2013-08-10'); 

insert into climate values ('Chennai', 'S', '2013-08-12'); 
insert into climate values ('Chennai', 'S', '2013-08-13'); 

insert into climate values ('Chennai', 'R', '2013-08-14'); 
insert into climate values ('Chennai', 'R', '2013-08-15'); 

insert into climate values ('Banglore', 'S', '2013-08-05'); 
insert into climate values ('Banglore', 'S', '2013-08-06'); 
insert into climate values ('Banglore', 'R', '2013-08-07'); 
insert into climate values ('Banglore', 'R', '2013-08-08'); 

insert into climate values ('Banglore', 'R', '2013-08-09'); 
insert into climate values ('Banglore', 'S', '2013-08-10'); 

insert into climate values ('Banglore', 'R', '2013-08-12'); 
insert into climate values ('Banglore', 'R', '2013-08-13'); 

insert into climate values ('Banglore', 'R', '2013-08-14'); 
insert into climate values ('Banglore', 'S', '2013-08-15'); 

Ссылка имеет приблизительные данные.

Из таблицы нам нужно получить название города и самую последнюю максимальную дату, когда статус ('R'/'S') остался таким же в течение более 2 дней.

ie. R-Raining S-Sunny

Нам нужно получить город и максимальную дату, когда город был Дождливым или Солнечный непрерывно в течение более 2 дней.

например: из примера данных,

Запрос должен получить

City     Date 
Banglore   2013-08-14 
Chennai   2013-08-08 

Заранее спасибо за помощь

+0

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

+0

am using SQL Server 2008 – user2664051

ответ

1

Для SQL Server 2005/2008:

select city, max(dt) max_dt 
from (
    select city 
     , dateadd(dd, x, Curdate) dt 
     , min(case x when 0 then status end) s0 
     , min(case x when 1 then status end) s1 
     , min(case x when 2 then status end) s2 
    from climate c 
    cross join (select 0 x union all select 1 union all select 2)x 
    group by city, dateadd(dd, x, Curdate) 
) t 
where s0 = s1 and s1 = s2 
group by city 

Если вы используете SQL Server 2012 запрос будет намного проще. Ищите функции LAG/LEAD.

1

Это похоже на острова и проблемы Пробелы и вы можете использовать общие табличные выражения, чтобы решить эту проблему, а также:

;WITH DateIslandByCityStatus_CTE (City, Status, CurDate, Island) AS 
(
    SELECT City 
     , Status 
     , CurDate 
     , Island = DATEADD(DAY, -ROW_NUMBER() OVER (PARTITION BY City, Status ORDER BY CurDate), CurDate) 
     FROM Climate 
), 
DateIslandWithTwoDaysOfWeather (City, Status, MaxDate) AS 
(
    SELECT City 
     , Status 
     , MAX(CurDate) 
     FROM DateIslandByCityStatus_CTE 
     GROUP BY City, Status, Island 
     HAVING COUNT(*) > 2 
) 
SELECT City 
    , Max(MaxDate) 
    FROM DateIslandWithTwoDaysOfWeather 
GROUP BY City 
ORDER BY City 

Смотрите также: "The SQL of Gaps and Islands in Sequences - Dwain Camps"

+0

Большое вам спасибо .. это сработало для меня ... – user2664051

0

При использовании SQL 2005 или выше:

select city, status, max(endDate) as Date 
from 
(
    select city, status, MIN(curdate) as startDate, MAX(curDate) as endDate 
    from 
    (
    select city, status, curdate, 
    DATEADD(dd, - ROW_NUMBER() OVER (PARTITION by city, status ORDER BY city, curdate), curdate) 
    from climate 
    group by city, status, curdate 
) consecutiveDates(city, status, curdate, grp) 
    group by city, status, grp 
    having COUNT(*) > 2 
) groupedConsecutiveDates 
group by city, status 
Смежные вопросы