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  

如果我有第三列说 ID 并且我想要按这些 ID 分组的差异,则再进行一个查询,例如

              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 的行,您应该在客户端而不是 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 回答