如何创建将一个表中的序列号添加到另一个表中的INSERT查询

时间:2019-04-23 06:05:32

标签: sql postgresql sequence greatest-n-per-group

我在 Postgres 10.7 数据库中有一个表格sample_1,其中包含一些纵向研究数据,并且每个sequence的编号key都是递增的。我需要INSERT来自临时表(sample_2)的数据,并相应地维护sequence列。

sequence数字从0开始。我假设我需要查询以在sequence中的每个key中查找最大的sample_1号,并将其添加到每个新行的后续序列号中。我主要在此步骤中使用序列号算法。试过这个:

INSERT INTO sample_1 (KEY, SEQUENCE, DATA)
SELECT KEY, sample_2.SEQUENCE + max(sample_1.SEQUENCE), DATA
FROM sample_2;

但是,我收到错误消息说不能在第2行中使用'sample_1.SEQUENCE',因为这是要插入的表。我无法弄清楚如何使用插入序列进行算术运算!

样本数据:

sample_1

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     0    |  a   |
| YMH_0001_XX |     1    |  b   |
| YMH_0002_YY |     0    |  c   |
sample_2

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     1    |  d   |
| YMH_0002_YY |     1    |  e   |
| YMH_0002_YY |     2    |  f   |

我要继续为插入的行每sequencekey个数字。

要清楚,本示例中的结果表将是3列和6行,例如:

sample_1

| KEY         | SEQUENCE | DATA |
+-------------+----------+------+
| YMH_0001_XX |     0    |  a   |
| YMH_0001_XX |     1    |  b   |
| YMH_0001_XX |     2    |  d   |
| YMH_0002_YY |     0    |  c   |
| YMH_0002_YY |     1    |  e   |
| YMH_0002_YY |     2    |  f   |

1 个答案:

答案 0 :(得分:1)

那应该做你想做的:

INSERT INTO sample_1 (key, sequence, data)
SELECT s2.key
     , COALESCE(s1.seq_base, -1)
     + row_number() OVER (PARTITION BY s2.key ORDER BY s2.sequence)
     , s2.data
FROM   sample_2 s2
LEFT   JOIN (
   SELECT key, max(sequence) AS seq_base
   FROM   sample_1
   GROUP  BY 1
   ) s1 USING (key);
笔记
  • 您需要以sequence中每个key的现有最大sample_1为基础。 (我将其命名为seq_base。)在子查询中对其进行计算并加入该查询。

  • 向其添加row_number(),如所示。这样可以保留输入行的顺序,并丢弃绝对数。

  • 我们需要 LEFT JOIN,以避免使用sample_2中的新键丢失行。
    同样,我们需要COALESCE为新密钥开始新的序列。默认为 -1 ,可在添加基于1的行号后有效地从 0 开始序列。

  • 这对于并发执行并不安全,但我认为这不是您的用例。