1

http://sqlfiddle.com/#!2/134bad

リンクにアクセスできなかった場合のデータ:

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 日以上同じままだった都市名と最新の最大日付を取得する必要があります。

すなわち。R-雨 S-晴れ

都市が 2 日以上連続して雨または晴れだった場合の都市と最大の日付を取得する必要があります。

例: サンプルデータから、

クエリは取得する必要があります

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

よろしくお願いいたします。

4

3 に答える 3

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

関連項目: 「シーケンス内のギャップとアイランドのSQL - ドウェイン・キャンプス」

于 2013-08-15T14:07:21.647 に答える
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 関数を探します。

于 2013-08-15T13:54:46.613 に答える
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
于 2013-08-15T14:14:15.997 に答える