【问题标题】:how to get all the contiguous interval of all IDs in a relation如何获取关系中所有ID的所有连续间隔
【发布时间】:2019-03-28 07:40:44
【问题描述】:

所以我的关系很简单:relation (ID, Date),其中 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


    【解决方案1】:

    我认为这个查询对你有用:

    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 的上下边界。之后,我们检查下边界和上边界,当它们等于时,将格式化的字符串设置为零。

    【讨论】:

      【解决方案2】:

      我希望这就是你要找的东西

       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 的表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 2018-06-22
        • 2017-01-20
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多