1

我有一个具有以下结构的 Postgres 表:

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

CREATE TABLE tb2 (
id integer,
name text,
date date
);

我需要生成一个第三个表tb3,该表将time_now包含增量步长为 10 分钟的列。如果tb1.time不等于tb3.time_nowb2.name填充。如果tb1.time等于(或接近time_now),则将其插入tb3
例子:

tb1

1, xxxx, 2014-10-01, 08:20:00
2, yyyy, 2014-10-01, 08:40:00

tb2

1, zzzz, 2014-10-01
2, vvvv, 2014-10-01
3, eeee, 2014-10-01

第三张表应如下所示:

1, 08:00:00,zzzz -----> from tb2
2, 08:10:00,vvvv -----> from tb2
3, 08:20:00,xxxx -----> from tb1
4, 08:30:00,eeee -----> from tb2
5, 08:40:00,yyyy -----> from tb1

如何做到这一点?

4

1 回答 1

0
SELECT t.id, t.time::text, COALESCE(t.name, t2.name) AS name
FROM  (
   SELECT g.id, g.time, t1.name
        , CASE WHEN t1.name IS NULL THEN
            row_number() OVER (PARTITION BY t1.name ORDER BY g.id)
          END AS rn
   FROM  (
      SELECT g AS id, '08:00'::time + '10 min'::interval * (g-1) AS time
      FROM   generate_series (1,6) g
      ) g
   LEFT JOIN tb1 t1 USING (time)
   ) t
LEFT   JOIN tb2 t2 ON t2.id = t.rn
ORDER  BY t.id;
  1. 首先用 建立一个所需时间的表generate_series()。在我的示例中,从 8:00 到 8:50。

  2. 加入到 tb1 上timerow_number()使用(rn)将升序数字附加到空槽。

  3. tb2按升序加入剩余的空槽。

  4. 使用 COALESCE 从tb1和中选择名称tb2

警惕 off-by-1 错误。

SQL小提琴。

旁白:我不会使用这些列名。id并且name不是描述性的 - 永远不要使用那些,更具体。date并且time是基本类型名称。

于 2014-12-11T22:01:36.623 回答