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

问题描述 投票:0回答:2

所以我的关系很简单:关系(ID,日期),哪个ID不是唯一的,不一定是任何顺序。每个ID都有一个日期(相同的ID可以具有相同的日期)。我的问题是找到所有ID的日期和NEXT日期之间的最长间隔。

所以,如果表格是这样的:

 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在一起

sql postgresql date intervals
2个回答
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的下边界和上边界。之后我们检查下边界和上边界,当它们等于使格式化的字符串为零时。


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获取下一个日期,以确定两个条目之间的持续时间。使用Postgres Recursive查询,您可以使用Windows函数重用原始查询。

我在日志表中使用过DISTINCT,但您也可以直接使用存储ID的表。

© www.soinside.com 2019 - 2024. All rights reserved.