【发布时间】:2013-10-18 16:49:44
【问题描述】:
我正在尝试使用 PostgreSQL 9.2.4 编写一个复杂的查询,但无法使其正常工作。我有一个包含时间范围以及其他几列的表。当我在这个表中存储数据时,如果所有列都相同,并且时间范围重叠或相邻,我将它们合并为一行。
不过,当我检索它们时,我想在日期边界处拆分范围 - 例如:
2013-01-01 00:00:00 to 2013-01-02 23:59:59
将被选为两行:
2013-01-01 00:00:00 to 2013-01-01 23:59:59
2013-01-02 00:00:00 to 2013-01-02 23:59:59
对于两个检索到的条目,其他列中的值相同。
我看到this question 似乎或多或少地解决了我想要的问题,但它是针对“非常旧”的 PostgreSQL 版本,所以我不确定它是否真的仍然适用。
我也见过this question,它完全符合我的要求,但据我所知CONNECT BY 语句是Oracle 对SQL 标准的扩展,所以我不能使用它。
我相信我可以使用 PostgreSQL 的 generate_series 来实现这一点,但我希望那里有一个简单的示例来演示如何使用它来做到这一点。
这是我目前正在处理的查询,目前不起作用(因为我无法在连接的子查询中引用 FROM 表),但我相信这或多或少正确的轨道。
Here's the fiddle 包含架构、示例数据和我的工作查询。
更新:我刚刚发现了一个有趣的事实,感谢this question,如果您在查询的SELECT 部分使用集合返回函数,PostgreSQL 将“自动”对集合和行进行交叉连接。我想我已经接近完成这项工作了。
【问题讨论】:
-
不言而喻,您的 Postgres 版本对这个问题至关重要。怎么能担心代码“非常陈旧”而仍然不让我们知道这些信息?
-
你说得对,这是一个愚蠢的遗漏。我正在使用 PostgreSQL 9.2.4。
-
最好把它放在你的问题中,而不仅仅是评论......在这样做的同时,还要添加你现在拥有的查询,即使它不起作用......
-
关于目标列表中的 SRF 函数(“自动”进行交叉连接):这是一个非常强大的功能,但会产生令人讨厌的副作用,并且完全非 SQL 标准。 Consider this related answer and the comments and links for more information!它的要点:一旦您拥有 Postgres 9.3,请改用
LATERAL- 正如我在下面的回答中所详述的那样。
标签: sql postgresql date-range generate-series