0

I have PostgreSQL table that look like this:

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

With following query I am creating table with row_id's and time starting from 09:00 with increment every 10 minutes

(
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)

After join I have new table which contain row's from table tb1 but only if time in tb1 have same time as one generated by '09:00'::time + '10 min'::interval * (g-1) AS time.

How to achieve that all rows with time from tb1 is "inserted" into generated table. If time generated is same than time from tb1 then no duplication should happen.

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 分スロットごとに 1 行しかないことを保証できる場合は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

結合条件はsargableであるため、インデックス ontimeを使用できます。

ソースの 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 に答える