【问题标题】:How to append new column to tuple for each in the group?如何为组中的每个添加新列到元组?
【发布时间】:2014-07-03 01:00:26
【问题描述】:

我的 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

编辑

好的,所以现在我有一个查询,它将为列和创建的共同作者列中的每个作者创建一个交叉产品,但我仍然需要从共同作者列中删除单个作者

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

【问题讨论】:

  • 查看我最近的回答stackoverflow.com/a/24432345/131874
  • 你怎么知道作者和合著者是谁?
  • 我想创建一个与解决方案命令之前的行数一样多的结果。看看我更新的问题。

标签: sql postgresql group-by


【解决方案1】:

我假设主要作者在paperid 组中的最小authorid

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;

【讨论】:

  • 我希望在运行命令之前有尽可能多的行,让每个共同作者在该论文的作者列中。看看我更新的问题。
  • 此解决方案将作者姓名与''分隔符分开,因此S. R. Duc作为作者将被拆分为S.作为答案。
【解决方案2】:

好的,所以我终于得到了这个(至少对于只有一个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

我现在将尝试找到整个表的解决方案(有很多 paperids)。

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2023-04-03
    • 2022-11-03
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多