在循环(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。我正在测试这是否有效。