Postgresql
如果某些列在多行中相同,如何設置值
我正在進行數據遷移,最終得到一個臨時表,如下所示:
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
)。
您的測試設置
(最好在您的問題中以這種方式提供- 提示!)
CREATE TEMP TABLE tmp ( curid int , cuid int , rtid int , cd date , dd date , rm text); INSERT INTO tmp VALUES (10, 4, 4, '2016-01-02', '2016-07-02', NULL) ,(16, 4, 4, '2016-06-12', '2016-12-12', 'Remarks Jun 12') ,(18, 5, 3, '2016-07-18', '2017-07-31', NULL) ,(8 , 5, 3, '2015-06-21', '2016-06-30', 'Add some test') ,(11, 6, 4, '2017-01-01', '2017-07-01', NULL) ,(9 , 7, 3, '2017-01-01', '2018-01-31', NULL);
解決方案
如果目標表不存在,則創建它們:
CREATE TEMP TABLE a ( id serial , curid int -- UNIQUE? , cuid int , rtid int ); CREATE TEMP TABLE b ( id serial , curid int , cd date , dd date , rm text );
用於
DISTINCT ON
表A:INSERT INTO a (curid, cuid, rtid) SELECT DISTINCT ON (cuid, rtid) curid, cuid, rtid FROM tmp ORDER BY cuid, rtid, curid -- pick smallest curid per group RETURNING *;
編號 | 丘里德 | 一些 | rtid -: | ----: | ---: | ---: 1 | 10 | 4 | 4 2 | 8 | 5 | 3 3 | 11 | 6 | 4 4 | 9 | 7 | 3
詳細解釋在這裡:
對錶 B使用簡單的視窗函式:
INSERT INTO b (curid, cd, dd, rm) SELECT min(curid) OVER (PARTITION BY cuid, rtid), cd, dd, rm FROM tmp ORDER BY cuid, rtid -- optional RETURNING *;
編號 | 丘里德 | 光碟 | dd | R M -: | ----: | :--------- | :--------- | :------------- 1 | 10 | 2016-01-02 | 2016-07-02 | *空值* 2 | 10 | 2016-06-12 | 2016-12-12 | 備註 6 月 12 日 3 | 8 | 2016-07-18 | 2017-07-31 | *空值* 4 | 8 | 2015-06-21 | 2016-06-30 | 添加一些測試 5 | 11 | 2017-01-01 | 2017-07-01 | *空* 6 | 9 | 2017-01-01 | 2018-01-31 | *零*
curid
保證匹配,因為我們在兩個查詢中選擇了最小的每組。dbfiddle在這裡