1

開始日と終了日の列を持つ異なるレコードがあります。開始日の昇順でレコードを並べ替えるとします。ある行の開始日と前の行の終了日の差を連続して見つけたい。

e.g.
Table: Data
------------
Date1           Date2           
13-DEC-2011     15-DEC-2011      
18-DEC-2011     16-DEC-2011     
21-DEC-2011     24-DEC-2011  

3 番目の列に ID があり、これらの ID でグループ化された違いが必要な場合は、もう 1 つのクエリを実行します。

              ID          Date1             Date2           
              1     13-DEC-2011     15-DEC-2011      
              1     18-DEC-2011     16-DEC-2011     
              2     21-DEC-2011     24-DEC-2011  
              2     25-JAN-2012     25-FEB-2012
              2     29-FEB-2012     25-MAR-2012


              and I need :  


             ID INTERVAL FREE
              1 15 DEC to 18 DEC
              2 24dec to 25 jan;25 feb to 29 feb
4

2 に答える 2

3

これがSQLFiddleのデモです

with t1 as
(
select t.*,
        row_number() over (order by date1) rn 
        from t
)
select t1.date1 as d1,t1.Date2 as d2 ,
t2.Date2 as PreviousDate2,
t1.Date1-t2.Date2 as DIff
from t1
left join t1 t2 on t1.rn=t2.rn+1
order by t1.rn

編集した質問に答えるクエリは次のとおりです。

SQLFiddle デモ

各 ID の行をカンマ区切りの 1 行で収集する必要がある場合は、SQL ではなくクライアント側で行う必要があります。

with t1 as
(
select t.*,
        row_number() over (partition by id order by date1) rn 
        from t
)
select t1.id,
t2.Date2 as PreviousDate2,
t1.date1 as d1
from t1
left join t1 t2 on (t1.rn=t2.rn+1) and (t1.id=t2.id)
where t2.Date2 is not null
order by t1.id,t1.rn
于 2012-12-05T13:30:25.770 に答える
0

これを試して ::

SELECT 
DATEDIFF(temp1.from, temp2.to) as diff
from
(
SELECT t.DATE1 as from, 
       @rownum := @rownum + 1 AS rank1
  FROM YOUR_TABLE t, 
       (SELECT @rownum := 0) r
order by Date1
) as temp1
inner join 

(
SELECT t.DATE2 as to, 
       @rownum := @rownum + 1 AS rank2
  FROM YOUR_TABLE t, 
       (SELECT @rownum := 1) r
order by Date1
) as temp2 on (temp1.rank1=temp2.rank2)
于 2012-12-05T13:31:55.327 に答える