检测间隔

时间:2015-04-21 14:57:56

标签: sql postgresql-8.4

id_person  transaction  internation_in internation_out  
1            456465     2015-01-01     2015-02-01  
2            564564     2015-02-03     2015-04-02   
3            4564654    2015-01-01     2015-01-05  
4            4564646    2015-01-01     2015-02-04  
4            4564656    2015-03-01     2015-04-15  
4            87899465   2015-05-16     2015-05-25  
5            56456456   2015-01-01     2105-01-08  
5            45456546   2015-02-04     2015-03-04

我想知道如何按id_person分组第一笔交易的internation_out与下一笔交易的internation_in之间的差异(小时数)。

我使用滞后和线索进行探测,但我无法按id_person

进行分组

我希望使用id_person 4作为结果

id_person交易差距
4 4564646 Null

4 4564656(2015-02-04-2015-03-01)的结果 4 87899465(2015-04-15-2015-05-16)的结果

1 个答案:

答案 0 :(得分:0)

如果您的时间段没有重叠(而您的时间段没有重叠),则会有一个简单的间隙计算:它是从开始到结束的总天数减去每行的总数。因此,您不需要lead()lag()

select id_person,
       (case when count(*) > 1
             then (max(internation_out) - min(internation_in) -
                   sum(internation_out - internation_in)
                  )
        end) as gap_duration
from table t
group by id_person;

请注意,如果此人只有一行,则会返回NULL。如果您需要0,那么您就不需要case