在循环(R或SQL)中按组连接列中的值

在循环(R或SQL)中按组连接列中的值,sql,r,Sql,R,假设我有以下数据: key id value ----- ---- -------- 30 1 A 30 2 B 40 1 C 40 2 D 50 1 A 50 2 C 50 3 D 60 1 A 60 2 B 60 3 C

假设我有以下数据:

 key  id   value            
----- ---- --------
   30  1    A        
   30  2    B               
   40  1    C    
   40  2    D       
   50  1    A  
   50  2    C  
   50  3    D          
   60  1    A
   60  2    B
   60  3    C
   60  4    D
我希望在R/SQL中按键进行列表聚合,以生成最后一列:

  key  id   value     Class       
----- ---- --------   --------
   30  1    A         A,B
   30  2    B         B      
   40  1    C         C,D
   40  2    D         D
   50  1    A         A,C,D
   50  2    C         C,D
   50  3    D         D 
   60  1    A         A,B,C,D
   60  2    B         B,C,D
   60  3    C         C,D
   60  4    D         D
当前行中类中的值始终包括组(键)中的当前值和未来值

有什么建议吗


非常感谢

在标准SQL中,可以使用
listag()
作为窗口函数。这看起来像:

select t.*,
       listagg(value, ',') within group (order by id) over (partition by key order by id desc) as class
from t;
但是,不同的数据库以不同的方式实现
listag()
,因此特定的语法取决于数据库

大多数数据库不允许将字符串聚合作为累积窗口函数。因此,您可以使用子查询执行您想要的操作:

select t.*,
       (select listagg(value, ',') within group (order by id)
        from t t2
        where t2.key = t.key and t2.id >= t.id
       ) as class
from t
order by key, id;

是一个dbfiddle,它使用Oracle,因为Oracle使用标准SQL中的
listag()

,您可以使用
listag()
作为窗口函数。这看起来像:

select t.*,
       listagg(value, ',') within group (order by id) over (partition by key order by id desc) as class
from t;
但是,不同的数据库以不同的方式实现
listag()
,因此特定的语法取决于数据库

大多数数据库不允许将字符串聚合作为累积窗口函数。因此,您可以使用子查询执行您想要的操作:

select t.*,
       (select listagg(value, ',') within group (order by id)
        from t t2
        where t2.key = t.key and t2.id >= t.id
       ) as class
from t
order by key, id;

是一个dbfiddle,它使用Oracle,因为Oracle在R中使用了
listag()

,您可以按
键进行分组,并创建一个从
id
到组中行数的序列,并将
值粘贴在一起

library(dplyr)

df %>%
  group_by(key) %>%
  mutate(Class = purrr::map_chr(id, ~toString(value[.x:n()])))
  # If id doesn't represent the row number for each key you can use
  #mutate(Class = purrr::map_chr(row_number(), ~toString(value[.x:n()])))

#     key    id value Class     
#   <int> <int> <chr> <chr>     
# 1    30     1 A     A, B      
# 2    30     2 B     B         
# 3    40     1 C     C, D      
# 4    40     2 D     D         
# 5    50     1 A     A, C, D   
# 6    50     2 C     C, D      
# 7    50     3 D     D         
# 8    60     1 A     A, B, C, D
# 9    60     2 B     B, C, D   
#10    60     3 C     C, D      
#11    60     4 D     D         
库(dplyr)
df%>%
分组依据(键)%>%
mutate(Class=purrr::map_chr(id,~toString(value[.x:n()]))
#如果id不代表可以使用的每个键的行号
#mutate(Class=purrr::map_chr(row_number(),~toString(value[.x:n()]))
#键id值类
#           
#1301A,B
#2302b
#340 1 C,D
#4402d
#5 50 1 A、C、D
#6502c,D
#750三维
#8601 A、B、C、D
#9602b,C,D
#1060 3 C,D
#11604d
数据

df <- structure(list(key = c(30L, 30L, 40L, 40L, 50L, 50L, 50L, 60L, 
60L, 60L, 60L), id = c(1L, 2L, 1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 
4L), value = c("A", "B", "C", "D", "A", "C", "D", "A", "B", "C", 
"D")), class = "data.frame", row.names = c(NA, -11L))

df在R中,您可以按
键进行分组,创建一个从
id
到组中行数的序列,并将
值粘贴在一起

library(dplyr)

df %>%
  group_by(key) %>%
  mutate(Class = purrr::map_chr(id, ~toString(value[.x:n()])))
  # If id doesn't represent the row number for each key you can use
  #mutate(Class = purrr::map_chr(row_number(), ~toString(value[.x:n()])))

#     key    id value Class     
#   <int> <int> <chr> <chr>     
# 1    30     1 A     A, B      
# 2    30     2 B     B         
# 3    40     1 C     C, D      
# 4    40     2 D     D         
# 5    50     1 A     A, C, D   
# 6    50     2 C     C, D      
# 7    50     3 D     D         
# 8    60     1 A     A, B, C, D
# 9    60     2 B     B, C, D   
#10    60     3 C     C, D      
#11    60     4 D     D         
库(dplyr)
df%>%
分组依据(键)%>%
mutate(Class=purrr::map_chr(id,~toString(value[.x:n()]))
#如果id不代表可以使用的每个键的行号
#mutate(Class=purrr::map_chr(row_number(),~toString(value[.x:n()]))
#键id值类
#           
#1301A,B
#2302b
#340 1 C,D
#4402d
#5 50 1 A、C、D
#6502c,D
#750三维
#8601 A、B、C、D
#9602b,C,D
#1060 3 C,D
#11604d
数据

df <- structure(list(key = c(30L, 30L, 40L, 40L, 50L, 50L, 50L, 60L, 
60L, 60L, 60L), id = c(1L, 2L, 1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 
4L), value = c("A", "B", "C", "D", "A", "C", "D", "A", "B", "C", 
"D")), class = "data.frame", row.names = c(NA, -11L))

df使用您正在使用的数据库标记您的问题。请使用您正在使用的数据库标记您的问题:mysql、oracle、sqlserver。。。?字符串聚合函数非常特定于数据库。请使用您正在使用的数据库标记您的问题。请使用您正在使用的数据库标记您的问题:mysql、oracle、sqlserver。。。?字符串聚合函数高度特定于数据库。谢谢。例如,它为第一个键提供A、B和A。我需要A、B和B。有什么办法解决这个问题吗?@Bernice你检查过更新的答案了吗?它给出了A,B和B。例如,它为第一个键提供A、B和A。我需要A、B和B。有什么办法解决这个问题吗?@Bernice你检查过更新的答案了吗?它给出了A,B和B谢谢你!我在R中使用sqldf包,它似乎支持group_concat。我正在测试这是否有效。谢谢!我在R中使用sqldf包,它似乎支持group_concat。我正在测试这是否有效。