我在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 |
我想继续提升sequence
数字每key
插入行。
需要明确的是,此示例中的结果表将是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 |
这应该做你想做的事情:
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);
Notes
sequence
每key
现有的最大sample_1
。 (我把它命名为seq_base
。)在子查询中计算并加入它。row_number()
。这保留了输入行的顺序,丢弃了绝对数字。LEFT
JOIN
来避免使用来自sample_2
的新密钥丢失行。
同样,我们需要COALESCE
为新密钥启动一个新序列。默认为-1,以在添加基于1的行号后有效地启动序列0。