簡體   English   中英

sql查詢從其中其他值列相同的一列中提取值

[英]sql query for extracting values from one column where other value columns are same

我有一個數據集

paper_author:

paper_id author_id
   1      521630
   1      972575
   1      1528710
   1      1611750
   2      1682088
   2      1589667
   2      972575 
   3      521630
   3      1589667

我需要獲取所有作者的共同作者信息,即與作者寫同一篇論文的作者,因此按作者分組

author_id  co_authors
 521630     972575,1528710,1611750,1589667
 972575     521630,1528710,1611750,1589667
 .......

在author_id = 521630的第一行中,author_id = 972575,1528710,1611750的作者寫了paper1,author_id = 1589667寫了論文3。我寫了R代碼

co_author_id<-vector()
for(i in 1:length(paper_author))
{
  author_id_data<-paper_author[i,2]
  index1<-which(paper_author$author_id %in% author_id_data
  paper_ids<-paper_author$paper_id[index1]
  index2<-which(paper_author$paper_id %in% paper_ids)
  co_authors<-paper_author$author_id[index2]
  co_author_id[i]<-paste(co_authors,collapse=" ")
 }

但這是非常低效的,因為數據大小為1200萬行,因此使用sql會很容易並且很好。

謝謝

這個問題有一個R標簽,所以我認為需要R解決方案:

sqldf

library(sqldf)
nr <- nrow(paper_author)
paper_author$seqno <- ave(1:nr, paper_author$paper_id, FUN = seq_along)


sqldf(c("create index i2 on paper_author(paper_id, seqno)",
    "select author_id, group_concat(coauthor) co_authors 
    from (
      select distinct A.author_id, C.author_id coauthor 
      from ( select * from main.paper_author where seqno = 1) A 
      left join (select * from main.paper_author where seqno > 1) C
      using (paper_id)
    ) group by author_id"))

數據表

library(data.table)
dt <- data.table(paper_author, key = "paper_id")
dt[, seqno:=1:.N, by = paper_id]
m <- merge(dt[seqno == 1], dt[seqno > 1], all.x = TRUE, by = "paper_id")
unique(m[, list(author_id.x, author_id.y)])[, 
   list(co_authors = toString(author_id.y)), by = author_id.x]

dplyr

library(dplyr)
gp <- paper_author %.% group_by(paper_id)
gp %.% 
  filter(row_number() == 1) %.%
  left_join( gp %.% filter(row_number() > 1), by = "paper_id" ) %.%
  ungroup() %.%
  select(author_id.x, author_id.y) %.%
  unique() %.%
  group_by(author_id.x) %.%
  summarise(co_authors = toString(author_id.y))

R基

nr <- nrow(paper_author)
seqno <- ave(1:nr, paper_author$paper_id, FUN = seq_along)
m <- merge(paper_author[seqno == 1, ], 
           paper_author[seqno > 1, ],  all.x = TRUE, by = "paper_id")
u <- unique(m[c("author_id.x", "author_id.y")])
aggregate(list(co_authors = u$author_id.y), list(author = u$author_id.x), toString)

請嘗試以下方法:

paper_author <-
structure(list(paper_id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L
), author_id = c(521630L, 972575L, 1528710L, 1611750L, 1682088L, 
1589667L, 972575L, 521630L, 1589667L), seqno = c(1L, 2L, 3L, 
4L, 1L, 2L, 3L, 1L, 2L)), .Names = c("paper_id", "author_id", 
"seqno"), row.names = c(NA, -9L), class = "data.frame")

修訂本以使作者在輸出中與眾不同。

這就是我對您的疑問的理解。 SQL小提琴

select
    pa1.author_id,
    array_agg(pa2.author_id order by pa2.author_id) as co_author
from
    paper_author pa1
    left join
    paper_author pa2 on
        pa1.paper_id = pa2.paper_id
        and pa1.author_id != pa2.author_id
group by pa1.author_id
order by pa1.author_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM