0

我有如下所示的 PostgreSQL 表:

CREATE TABLE tb1 (
id integer,
name text,
date date,
time time without tz
);

通过以下查询,我正在创建带有 row_id 的表,时间从 09:00 开始,每 10 分钟递增一次

(
SELECT g AS id, '09:00'::time + '10 min'::interval * (g-1) AS time
FROM   generate_series (1,10) g
) g
left JOIN tb1 AS t1 USING (time)

加入后,我有一个新表,其中包含表 tb1 中的行,但前提是 tb1 中的时间与 '09:00'::time + '10 min'::interval * (g-1) AS 时间生成的时间相同。

如何实现将来自 tb1 的所有行“插入”到生成的表中。如果生成的时间与 tb1 的时间相同,则不应发生重复。

4

2 回答 2

0

我想你想要一个完整的外部连接。

(
SELECT g AS id, '09:00'::time + '10 min'::interval * (g-1) AS time
FROM   generate_series (1,10) g
) g
FULL OUTER JOIN tb1 AS t1 USING (time)
于 2014-12-13T22:40:28.440 回答
0

如果您可以保证 中的每 10 分钟时隙不超过一行tb1,那么这应该是最快的:

SELECT *
FROM  (
   SELECT g AS id, '09:00'::time + '10 min'::interval * (g-1) AS time_slot
   FROM   generate_series (1,10) g
   ) g
LEFT  JOIN tb1 t1 ON t1.time >= g.time_slot
                 AND t1.time <  g.time_slot + '10 min'::interval

连接条件是sargabletime ,因此可以使用索引 on 。

如果源中每个 10 分钟槽可以有多行,并且结果中需要单行,则需要以一种或另一种方式聚合。像:

SELECT g.id, g.time_slot, t1.time, min(t1.whatever) AS min_whatever
FROM  (
   SELECT g AS id, '09:00'::time + '10 min'::interval * (g-1) AS time_slot
   FROM   generate_series (1,10) g
   ) g
LEFT  JOIN tb1 t1 ON t1.time >= g.time_slot
                 AND t1.time <  g.time_slot + '10 min'::interval
GROUP BY 1, 2, 3;
于 2014-12-14T16:36:02.267 回答