【问题标题】:Merge overlapping time intervals, how?合并重叠的时间间隔,如何?
【发布时间】:2013-10-16 01:45:55
【问题描述】:

任何人都可以在**合并数据区间的查询中帮助我?
例如:普通选择:

SELECT id, date_start, date_end FROM eventto ORDER BY date_start

我知道了:


来自:


但是想要一个返回这个的查询:

01 - 2013-10-11 08:00:00 2013-10-11 15:00:00
02 - 2013-10-11 2013-10-11 16:00:00 19:00:00

非常感谢!

【问题讨论】:

  • 您能否以文本形式发布您的数据表(在标题中带有id、date_start、date_end)?
  • This SO post 提供了一个非常相似的问题的答案。第一个答案甚至有 Postgresql SQL Fiddle。
  • 预期结果的第二行不会来自16:00 而不是14:00?
  • 起来,是的!我可能在想下午4点!我会解决这个问题,Kordirko 的回答有效。非常感谢。

标签: sql postgresql merge overlap date-range


【解决方案1】:

您也可以尝试这个查询(除了上面评论中PM 77-1 给出的解决方案之外,还有更多解决方案):

WITH RECURSIVE cte( id, date_start, date_end ) AS
(
  SELECT id, date_start, date_end
  FROM evento
  UNION 
  SELECT e.id,
         least( c.date_start, e.date_start ),
         greatest( c.date_end, e.date_end )
  FROM cte c
  JOIN evento e
  ON e.date_start between c.date_start and c.date_end
     OR 
     e.date_end between c.date_start and c.date_end
)
SELECT distinct date_start, date_end
FROM (
  SELECT id, 
         min( date_start) date_start, 
         max( date_end ) date_end
  FROM cte
  GROUP BY id
) xx
ORDER BY date_start;

演示 ---> http://www.sqlfiddle.com/#!12/bdf7e/9

但是对于大表,此查询的性能可能会非常缓慢,并且某些过程方法可能会执行得更好。

【讨论】:

  • 哇!刚才我看到了你的回答,我没有收到任何警告;~非常感谢你,你的查询完美无缺!我尝试了很长时间。
  • 您将如何为 SQL Server 2008 编写此查询? SQL Server 没有“最小”和“最大”功能。
  • @Thracian 使用CASE 表达式,例如least( x, y ) 可以替换为case when x < y then x else y end,类似greatest( x, y ) 可以改写为:case when x > y then x else y end
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 2014-02-23
  • 1970-01-01
  • 2016-01-24
  • 2011-02-03
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多