我正在进行数据迁移,最终得到一个临时表,如下所示:
curid cuid rtid cd dd rm
10 4 4 2016-01-02 2016-07-02
16 4 4 2016-06-12 2016-12-12 Remarks Jun 12
18 5 3 2016-07-18 2017-07-31
8 5 3 2015-06-21 2016-06-30 Add some test
11 6 4 2017-01-01 2017-07-01
9 7 3 2017-01-01 2018-01-31
我需要将数据分成两个表。基于相同的数据,它应该是这样的:
Table A
id curid cuid rtid
1 10 4 4
2 18 5 3
3 11 6 4
4 9 7 3
这是每个不同的行(cuid, rtid)
加上curid
从每组重复项中选择的值。id
只是一个序号。
Table B
id curid cd dd rm
1 10 2016-01-02 2016-07-02
2 10 2016-06-12 2016-12-12 Remarks Jun 12
3 18 2016-07-18 2017-07-31
4 18 2015-06-21 2016-06-30 Add some test
5 11 2017-01-01 2017-07-01
6 9 2017-01-01 2018-01-31
实际curid
是无关紧要的,只要中的记录Table B
与中的关联记录相匹配Table A
(因此我们甚至可以使用临时序列或其他东西来设置curid
)。
您的测试设置
(最好在您的问题中以这种方式提供- 提示!)
解决方案
如果目标表不存在则创建它们:
用于
DISTINCT ON
表A:详细解释在这里:
对表 B使用一个简单的窗口函数:
curid
保证匹配,因为我们在两个查询中都选择了每组中最小的一个。dbfiddle在这里
我想你要找的是dense_rank()
澄清一下,我在 Microsoft SQL 中要做的是,
这会创建一个包含 (cuid, rtid) 的每个组合的新表 [another_table],在新表中有一个行 id。
现在,其中有多少适用于 PostgreSQL?