2017-11-19 24 views
0

私はテーブルを持っている:SQL - グループ行の連続日付別

Value Date 
100  01/01/2000 
110  01/05/2002 
100  01/10/2003 
100  01/12/2004 

私はグループに

Value  StartDate  EndDate 
100   01/01/2000  30/04/2002 
110   01/05/2002  30/09/2003 
100   01/10/2003  NULL --> or value like '01/01/2099' 

この方法でデータがどのように私はこれを達成することができますしたいですか? CTEはどのように役立つのですか? RDBMSがサポートするため

+2

使用するRDBMSを指定 – Mike

+0

Microsoft SQL Server 2012 –

答えて

0

窓関数(MS SQLデータベース上の例では):

select value, min(date) as endDate, 
     dateadd(day, -1, lead(min(date)) over (order by min(date))) as endDate 
from (select t.*, 
      row_number() over (order by date) as seqnum, 
      row_number() over (partition by value order by date) as seqnum_v 
     from t 
    ) t 
group by value, (seqnum - seqnum_v); 

行番号の差:

with Test(value, dt) as(
    select 100, cast('2000-01-01' as date) union all 
    select 110, cast('2002-05-01' as date) union all 
    select 100, cast('2003-10-01' as date) union all 
    select 100, cast('2004-12-01' as date) 
) 
select max(value) value, min(dt) startDate, max(end_dt) endDate 
    from (
    select a.*, sum(brk) over(order by dt) grp 
     from (
     select t.*, 
       case when value!=lag(value) over(order by dt) then 1 else 0 end brk, 
       DATEADD(DAY,-1,lead(dt,1,cast('2099-01-02' as date)) over(order by dt)) end_dt 
      from Test t 
    ) a 
) b 
group by grp 
order by startDate 
+0

MSSQLの場合:\t _lead(dt、1、DATE'2099-01-02 ')以上(dtによる順序)-1 end_dt_ - > ** isnull(dateadd(d、-1、dt))、 '29990101')end_dt' **とうまくいくようです –

0

Iは、行番号の差が、この場合には簡単であると思いますあなたが望むグループを定義します。これは少し難しいです。 。 。サブクエリの結果を見ると、その動作がわかります。

関連する問題