如何获取关系中所有ID的所有连续间隔

时间:2019-03-28 07:40:45

标签: sql postgresql date intervals

所以我的关系很简单:关系(ID,日期),该ID不是唯一的,并且不一定按任何顺序排列。每个ID都有一个日期(相同的ID可以具有相同的日期)。我的问题是找到所有ID的日期与其下一个日期之间的最长间隔。

因此,如果表是这样的:

 ID     |   Date
--------+------------
    100 | 2015-06-20
    100 | 2015-01-21
    100 | 2016-04-23

预期输出将为

ID      |   interval
--------+------------
    100 | (2016-04-23 - 2015-06-20)

或如果ID的所有日期都相同:

 ID     |   Date
--------+------------
    100 | 2016-04-23
    100 | 2016-04-23
    100 | 2016-04-23

预期输出应为

ID      |   interval
--------+------------
    100 |        0

这是一个ID,在我的关系中,共有100个ID

2 个答案:

答案 0 :(得分:0)

我认为此查询对您有用:

select t.id,
       case
         when t.lower != t.upper then '(' || t.lower || ' - ' || t.upper || ')'
         else '0' end
from (select
             r.id,
             min(r.date) as lower,
             max(r.date) as upper
      from relation r
      group by r.id) t;

我们使用子查询来查找每个ID的上下边界。之后,我们检查上下边界是否相等,使格式化的字符串不为零。

答案 1 :(得分:0)

我希望这就是您要寻找的

 WITH x AS 
(
   SELECT id, _date, lead_date, EXTRACT(epoch FROM age(lead_date,_date))/(3600*24) AS age
     FROM
        (
          SELECT *,  lead(_date) over(PARTITION BY id ORDER BY _date ) lead_date
            from table_log
            order by id, _date
        ) as z
    WHERE lead_date IS NOT NULL
    ORDER BY 4 DESC
 )
SELECT DISTINCT id ,
   (SELECT age FROM x WHERE x.id = t1.id ORDER BY age DESC LIMIT 1)
  FROM table_log t1

在这里,我已使用windows function获取下一个日期来确定2个条目之间的持续时间。使用Postgres Recursive查询,您可以重新使用带有Windows功能的原始查询。

我已经使用了日志表中的DISTINCT,但是您也可以直接使用存储ID的表。