2014-07-03 37 views
0

我在我的Postgres数据库中的以下数据集:如何将新列添加到组中的每个元组?

paperid | authorid |   name   | 
---------+----------+----------------------+ 
    896452 |  4976 | S. R. Duc   | 
    896452 | 186921 | F. Kolo    | 
    896452 | 318493 | C. D. Becker   | 
    896452 | 615968 | V. B. Duthon   | 
    896452 | 823663 | C. C. Charbonnier | 
    896452 | 833091 | P. Hoffmeyer   | 
    896452 | 843054 | C. W. A. Pfirrmann | 
    896452 | 1058596 | J. Menetrey   | 
    896452 | 2033639 | N. Magnenat-Thalmann | 

,从我想为每一个作者对于给定的纸附加列“共同作者”的条目 - 列出用空格分隔所有的合作者,类似(但每个作者):

paperid | author   |               coauthors                
---------+-------------------+------------------------------------------------------------------------------------------------------------ 
    896452 | S. R. Duc   | C. C. Charbonnier C. D. Becker C. W. A. Pfirrmann F. Kolo J. Menetrey N. Magnenat-Thalmann P. Hoffmeyer V. B. Duthon 
    896452 | C. C. Charbonnier | S. R. Duc C. D. Becker C. W. A. Pfirrmann F. Kolo J. Menetrey N. Magnenat-Thalmann P. Hoffmeyer V. B. Duthon 
... etc for each coauthor 

编辑

好了,现在我有一个查询,这将创建一个跨产品的每个AU雷神从列和创建的合作者列,但我仍然需要从合作者列

SELECT foo.paperid, npa.name, foo.authors FROM newpaperauthor npa CROSS JOIN (select paperid, string_agg(name, ' ') as authors         
FROM newpaperauthor 
GROUP BY paperid 
ORDER BY paperid) foo ; 
paperid |   name   |               authors                
---------+----------------------+-------------------------------------------------------------------------------------------------------------------------------- 
    896452 | S. R. Duc   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | F. Kolo    | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. D. Becker   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | V. B. Duthon   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. C. Charbonnier | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | P. Hoffmeyer   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. W. A. Pfirrmann | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | J. Menetrey   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | N. Magnenat-Thalmann | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
+0

检查我最近的答案http://stackoverflow.com/a/24432345/131874 –

+1

你怎么知道作者是谁以及合着者是谁? –

+0

我想用解决方案命令之前的行数创建一个结果。看看我更新的问题。 – Patryk

回答

0

好了,我这最后的(至少对于只有一个paperid表):

SELECT foo.paperid, npa.name, foo.authors INTO npatest FROM newpaperauthor npa CROSS JOIN (select paperid, string_agg(name, ' ') as authors 
FROM newpaperauthor 
GROUP BY paperid 
ORDER BY paperid) foo ; 
UPDATE npatest SET authors = regexp_replace(authors, concat(name, ' '), ''); 
SELECT * FROM npatest; 

SELECT 9 
UPDATE 9 
paperid |   name   |               authors                
---------+----------------------+-------------------------------------------------------------------------------------------------------------------------------- 
    896452 | S. R. Duc   | F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | F. Kolo    | S. R. Duc C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. D. Becker   | S. R. Duc F. Kolo V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | V. B. Duthon   | S. R. Duc F. Kolo C. D. Becker C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. C. Charbonnier | S. R. Duc F. Kolo C. D. Becker V. B. Duthon P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | P. Hoffmeyer   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 
    896452 | C. W. A. Pfirrmann | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer J. Menetrey N. Magnenat-Thalmann 
    896452 | J. Menetrey   | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann N. Magnenat-Thalmann 
    896452 | N. Magnenat-Thalmann | S. R. Duc F. Kolo C. D. Becker V. B. Duthon C. C. Charbonnier P. Hoffmeyer C. W. A. Pfirrmann J. Menetrey N. Magnenat-Thalmann 

现在我会尽力找到整个表的解决方案(与许多paperid S)。

0

我认为主要作者是最小authorid一个paperid组中删除单个作者。

SELECT PAPERID, 
     SPLIT_PART(STRING, ' ', 1) AS AUTHOR, 
     RIGHT(STRING, LENGTH(STRING) - LENGTH(SPLIT_PART(STRING, ' ', 1))-1) AS COAUTHORS 
FROM (
     SELECT PAPERID, 
       STRING_AGG(NAME, ' ' ORDER BY AUTHORID) AS STRING 
     FROM (
       SELECT * 
       FROM PAPERWORK 
       WHERE PAPERID='896452' 
      ) AS TEMP1 
     GROUP BY PAPERID 
    ) AS TEMP2; 
+0

我希望在运行该命令之前有多少行,使每个共同作者在该论文的作者列中都有。看看我更新的问题。 – Patryk

+0

该解决方案将作者姓名与分隔符分开,因此存在S. R. Duc'作为作者,它将被分成“S”作为答案。 – Patryk

相关问题