Postgresql

如果某些列在多行中相同,如何設置值

  • July 7, 2017

我正在進行數據遷移,最終得到一個臨時表,如下所示:

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 ONA

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在這裡

引用自:https://dba.stackexchange.com/questions/177957